findContours()函数存储在contours中的数据形式
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中的数据形式相关推荐
- pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list
pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list(index of rows with missing values in dataframe ...
- R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)、使用window函数从时间序列对象中提取数据子集
R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series).使用window函数从时间序列对象中提取数据子集 目录
- 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作
https://www.zybuluo.com/aitanjupt/note/209941 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作 〇.摘要 一.基础环境 二.数据存 ...
- python——函数(定义函数、传递实参、返回值、传递列表、传递任意数量的实参、将函数存储在模块中、函数编写指南)
目录 定义函数 传递实参 返回值 传递列表 传递任意数量的实参 将函数存储在模块中 函数编写指南 定义函数 #------定义函数---------- def user():print('hello! ...
- 存储在Redis中的数据多大比较合适
存储在Redis中的数据多大比较合适 背景 过大的数据对 Redis 的影响 『过大』的定义是什么 结论 背景 本文是工作中应对一个实际业务场景的调研总结过程.在使用 redis 作为数据缓存的时候, ...
- android 读取内部存储文件格式,Android中的数据储存之文件存储
当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...
- 《Python编程从入门到实践》记录之将Python函数存储在模块中(import、import*)
目录 1.导入整个模块 2.导入特定的函数 3.使用as给函数指定别名 4.导入模块中的所有函数 5.总结 我们可以在编写程序时将函数存储在被称为模块的独立文件中,再将模块导入到主程序中(必须的步骤) ...
- vue的methods属性的方法中出现回调函数,在回调函数内部获取data中的数据
在vue中,可能会遇到在methods属性中书写的方法中出现回调函数的情况,如以下代码: data(){return{gemometry: ""} } methods: {draw ...
- SQL SERVER 使用 OPENRORWSET(BULK)函数将txt文件中的数据批量插入表中(2)
1/首先建立数据表 CREATE TABLE BasicMsg (IDFlag INT IDENTITY PRIMARY KEY NOT NULL, RecvTime FLOAT NOT NULL , ...
最新文章
- mysql 存储过程 递增_mysql 存储过程实例 (日期以小时递增 while loop循环嵌套 随机数生成)...
- cmakelists 常见用法
- php委托模式,PHP设计模式 - 委托模式
- 【Git】Git使用记录: 撤回已经commit到本地的提交记录
- zk服务器系统,windows系统搭建zookeeper服务器的教程
- 创建WebPart时的数据库连接问题。
- 使用VS2019创建项目,添加文件和库地址
- word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录
- Delta3d组件机制
- 项目改用GoModules管理依赖的方法和经验总结
- [APIO2009]抢掠计划
- python培训多久能入职_Python学到什么程度可以面试工作?
- 电脑怎么卸载软件干净_电脑卸载软件怎么卸载?
- python 给数组修改值_DAY2-step4 Python数组:创建,追加,弹出,反转示例
- 求和值大于等于776且和值最小的两个数
- 【GANs学习笔记】(十三)BIGGAN
- 一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装
- Google Earth Engine ——QGIS中计算加权质心
- [增强现实]Unity制作AR增强现实--茶壶(亲测)
- SQL语句LIKE CONCAT模糊查询