findcontou()函数的运用一般都与vector<vector<Point>>Contours;和vector<Vec4i> Hierarchy这两个函数一起使用;Contours的内部的数据是如何储存的,困惑了我好几天,今天终于找到了答案!
contours.size():表示轮廓的个数
contours[i].size():表示第i个轮廓中点的个数
我们利用一个二维数组就可以输出轮廓内的点集了:

for (int i = 0; i < Contours.size(); i++){数for (int j = 0;j < Contours[i].size();j++){cout << "输出轮廓第"<<j+1<<"个点的坐标  " << Contours[i][j] << endl;cout<< "输出轮廓i的第j个点的x坐标  " <<Contours[i][j].x << endl;  //试试看输出轮廓第一个点的横坐标 xcout<< "输出轮廓i的第j个点的y坐标  " <<Contours[i][j].y << endl;  //试试看输出轮廓第一个点的纵坐标 y}}

完整代码如下:

#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include<fstream>
using namespace cv;
using namespace std;#define WINDOW_NAME1 "【原始图窗口】"                      //为窗口标题定义的宏
#define WINDOW_NAME2 "【轮廓图】"                                       //为窗口标题定义的宏Mat g_srcImage;
Mat g_grayImage;
int g_nThresh = 80;
int g_nThresh_max = 255;
RNG g_rng(12345);
Mat g_cannyMat_output;
vector<vector<Point>>Contours;
vector<Vec4i> g_vHierarchy;void on_ThreshChange(int, void*);int main(int argc, char** argv){g_srcImage = imread("1.png");if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n");return false; }cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);blur(g_grayImage, g_grayImage, Size(3, 3));namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);//创建窗口imshow(WINDOW_NAME1, g_srcImage);createTrackbar("canny阈值", WINDOW_NAME1, &g_nThresh, g_nThresh_max, on_ThreshChange);//创建滚动条并初始化on_ThreshChange(0, 0);waitKey(0);return(0);}
//-----------------------------------【on_ThreshChange()函数】------------------------------
void on_ThreshChange(int, void*)
{ofstream outfile;outfile.open("data.txt");Canny(g_grayImage, g_cannyMat_output, g_nThresh, g_nThresh * 2, 3);//用Canny算子检测边缘findContours(g_cannyMat_output, Contours, g_vHierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point(0, 0));//寻找轮廓cout << "轮廓的总个数是 " << Contours.size() << endl;Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);for (int i = 0; i < Contours.size(); i++){Scalar color = Scalar/*(255, 255, 255);// */(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值drawContours(drawing, Contours, i, color, 1, 8, g_vHierarchy, 0, Point());printf("\n输出 轮廓序号,轮廓:   %d \n", i);cout << "输出轮廓包含点的总数:  " << Contours[i].size() << endl;    //试试看输出该轮廓点的总数for (int j = 0;j < Contours[i].size();j++){cout << "输出轮廓第"<<j+1<<"个点的坐标  " << Contours[i][j] << endl;outfile<<j+1   << Contours[i][j] << endl;  //将数据输出到  data.txt文件中去}cout<< "输出轮廓第0个点的x坐标  " <<Contours[i][0].x << endl;  //试试看输出轮廓第一个点的横坐标 xcout<< "输出轮廓第0个点的y坐标  " <<Contours[i][0].y << endl;  //试试看输出轮廓第一个点的纵坐标 y}outfile.close();imwrite("..\\findContours.bmp", drawing);//显示效果图imshow(WINDOW_NAME2, drawing);}

这就可以获取轮廓上所有点的信息了!

测试图片:

实验结果:

findContours()函数存储在contours中的数据形式相关推荐

  1. pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list

    pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list(index of rows with missing values in dataframe ...

  2. R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)、使用window函数从时间序列对象中提取数据子集

    R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series).使用window函数从时间序列对象中提取数据子集 目录

  3. 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作

    https://www.zybuluo.com/aitanjupt/note/209941 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作 〇.摘要 一.基础环境 二.数据存 ...

  4. python——函数(定义函数、传递实参、返回值、传递列表、传递任意数量的实参、将函数存储在模块中、函数编写指南)

    目录 定义函数 传递实参 返回值 传递列表 传递任意数量的实参 将函数存储在模块中 函数编写指南 定义函数 #------定义函数---------- def user():print('hello! ...

  5. 存储在Redis中的数据多大比较合适

    存储在Redis中的数据多大比较合适 背景 过大的数据对 Redis 的影响 『过大』的定义是什么 结论 背景 本文是工作中应对一个实际业务场景的调研总结过程.在使用 redis 作为数据缓存的时候, ...

  6. android 读取内部存储文件格式,Android中的数据储存之文件存储

    当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...

  7. 《Python编程从入门到实践》记录之将Python函数存储在模块中(import、import*)

    目录 1.导入整个模块 2.导入特定的函数 3.使用as给函数指定别名 4.导入模块中的所有函数 5.总结 我们可以在编写程序时将函数存储在被称为模块的独立文件中,再将模块导入到主程序中(必须的步骤) ...

  8. vue的methods属性的方法中出现回调函数,在回调函数内部获取data中的数据

    在vue中,可能会遇到在methods属性中书写的方法中出现回调函数的情况,如以下代码: data(){return{gemometry: ""} } methods: {draw ...

  9. SQL SERVER 使用 OPENRORWSET(BULK)函数将txt文件中的数据批量插入表中(2)

    1/首先建立数据表 CREATE TABLE BasicMsg (IDFlag INT IDENTITY PRIMARY KEY NOT NULL, RecvTime FLOAT NOT NULL , ...

最新文章

  1. mysql 存储过程 递增_mysql 存储过程实例 (日期以小时递增 while loop循环嵌套 随机数生成)...
  2. cmakelists 常见用法
  3. php委托模式,PHP设计模式 - 委托模式
  4. 【Git】Git使用记录: 撤回已经commit到本地的提交记录
  5. zk服务器系统,windows系统搭建zookeeper服务器的教程
  6. 创建WebPart时的数据库连接问题。
  7. 使用VS2019创建项目,添加文件和库地址
  8. word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录
  9. Delta3d组件机制
  10. 项目改用GoModules管理依赖的方法和经验总结
  11. [APIO2009]抢掠计划
  12. python培训多久能入职_Python学到什么程度可以面试工作?
  13. 电脑怎么卸载软件干净_电脑卸载软件怎么卸载?
  14. python 给数组修改值_DAY2-step4 Python数组:创建,追加,弹出,反转示例
  15. 求和值大于等于776且和值最小的两个数
  16. 【GANs学习笔记】(十三)BIGGAN
  17. 一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装
  18. Google Earth Engine ——QGIS中计算加权质心
  19. [增强现实]Unity制作AR增强现实--茶壶(亲测)
  20. SQL语句LIKE CONCAT模糊查询

热门文章

  1. JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了
  2. 根据风场数据,画出剖面和断面海洋流场
  3. mysql之xtrabackup备份及恢复
  4. 20221214英语学习
  5. 二、ESP32基于Arduino IDE OLED 联网显示时间
  6. 玉流馆,吃狗肉看朝鲜MM
  7. 监督学习和无监督学习对比总结
  8. java基础~重写与重载
  9. 202003关于手机设备、系统、型号排名等信息
  10. 12位自拍达人眼中的美图手机 要他们买不容易