Opencv提取连通区域轮廓的方法
本文实例为大家分享了Opencv提取连通区域轮廓的具体代码,供大家参考,具体内容如下
在进行图像分割后,可能需要对感兴趣的目标区域进行提取,比较常用的方法是计算轮廓。
通过轮廓可以获得目标的一些信息:
(1)目标位置
(2)目标大小(即面积)
(3)目标形状(轮廓矩)
当然,轮廓不一定代表希望目标区域,阈值分割时可能造成一部分信息丢失,因此可以计算轮廓的质心坐标,再进行漫水填充。
程序中有寻找质心+填充,但效果不好,因此就不放填充后的图了。
实验结果:
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdio.h> using namespace cv; using namespace std; vector<vector<Point> > contours; //轮廓数组 vector<Point2d> centers; //轮廓质心坐标 vector<vector<Point> >::iterator itr; //轮廓迭代器 vector<Point2d>::iterator itrc; //质心坐标迭代器 vector<vector<Point> > con; //当前轮廓 int main() { double area; double minarea = 100; double maxarea = 0; Moments mom; // 轮廓矩 Mat image,gray,edge,dst; namedWindow("origin"); namedWindow("connected_region"); image = imread("view.jpg"); cvtColor(image, gray, COLOR_BGR2GRAY); blur(gray, edge, Size(3,3)); //模糊去噪 threshold(edge,edge,200,255,THRESH_BINARY); //二值化处理 /*寻找轮廓*/ findContours( edge, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); itr = contours.begin(); //使用迭代器去除噪声轮廓 while(itr!=contours.end()) { area = contourArea(*itr); if(area<minarea) { itr = contours.erase(itr); //itr一旦erase,需要重新赋值 } else { itr++; } if (area>maxarea) { maxarea = area; } } dst = Mat::zeros(image.rows,image.cols,CV_8UC3); /*绘制连通区域轮廓,计算质心坐标*/ Point2d center; itr = contours.begin(); while(itr!=contours.end()) { area = contourArea(*itr); con.push_back(*itr); if(area==maxarea) drawContours(dst,con,-1,Scalar(0,0,255),2); //最大面积红色绘制 else drawContours(dst,con,-1,Scalar(255,0,0),2); //其它面积蓝色绘制 con.pop_back(); //计算质心 mom = moments(*itr); center.x = (int)(mom.m10/mom.m00); center.y = (int)(mom.m01/mom.m00); centers.push_back(center); itr++; } imshow("origin",image); imshow("connected_region",dst); waitKey(0); /*漫水填充连通区域*/ Point2d seed; int new_scalar = 0; int loDiff = 8, upDiff = 8; int connectivity = 4; itrc = centers.begin(); while(itrc!=centers.end()) { seed = *itrc; floodFill(image,seed,Scalar::all(new_scalar),NULL, Scalar::all(loDiff),Scalar::all(upDiff),connectivity); itrc++; } waitKey(0); return 0 ; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 01-10c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的
- 01-10实现opencv图像裁剪分屏显示示例
- 01-10使用opencv拉伸图像扩大分辨率示例
- 01-10使用C语言提取子字符串及判断对称子字符串最大长度
- 01-10详解C++编程中的重载流插入运算符和流提取运算符
- 01-10基于C++实现kinect+opencv 获取深度及彩色数据
- 01-10浅谈CMake配置OpenCV 时静态链接与动态链接的选择
- 01-10OpenCV中C++函数imread读取图片的问题及解决方法
- 01-10visual studio 2013中配置opencv图文教程 Opencv2.4.9安装配置教程
- 01-10怎么用C++提取任意一张图片的特征(从内存读取数据)
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10C#中split用法实例总结
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10SublimeText编译C开发环境设置