opencv里面有检测opencv 获取连通区域域的函数吗

请问 opencv里面有检测连通区域的函数吗
[问题点数:20分,结帖人liguogezi]
请问 opencv里面有检测连通区域的函数吗
[问题点数:20分,结帖人liguogezi]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|网站已改版,请使用新地址访问:
ConnectedComponent 连通区域寻找,不是findcontours函数的,用的是两遍扫描法 OpenCV 247万源代码下载- www.pudn.com
&文件名称: ConnectedComponent& & [
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 2 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:连通区域寻找,不是findcontours函数的,用的是两遍扫描法-fin connected region, not using findcontours function, using a two-pass scanning method
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&connected_components.cpp&&connected_components.h
&输入关键字,在本站247万海量源码库中尽情搜索:opencv中图像有两个或多个连通域,如何访问最小面积的连通域,并获取该连通域中的坐标呢?
[问题点数:0分,结帖人berlinpand]
opencv中图像有两个或多个连通域,如何访问最小面积的连通域,并获取该连通域中的坐标呢?
[问题点数:0分,结帖人berlinpand]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
匿名用户不能发表回复!|用OpenCv找出最大连通域,并对其进行连通域进行ROI - opencv - ITkeyowrd
用OpenCv找出最大连通域,并对其进行连通域进行ROI
推荐:OpenCV支持大量的轮廓、边缘、边界的相关函数,相应的函数有moments、HuMoments、findContours、drawContours、approxPolyDP、arcLength、boundingRect、contour
2018阿里云全部产品优惠券(好东东,强烈推荐)领取地址:
用OpenCv找出最大连通域,并对其进行连通域进行ROI
( 21:53:33)
  由于项目需要,要对图像中的最大连通域进行标定,并且存储。首先需要使用cvFindCountour对边缘进行标定,其实它的原理就是连通域的边缘提取;其次就是对连通域进行大小判断找出最大的连通域;最后当然就是进行Rect并且ROI了。如果有需要可以进行存储。直接上源码吧。
#include &cv.h& #include &cxcore.h& #include &highgui.h& & int main( int argc, char** argv ) { &//声明IplImage指针 &IplImage* pImg = cvLoadImage(&e:/black.jpg&,0); &IplImage* pContourImg = NULL; &CvMemStorage * storage = cvCreateMemStorage(0); &CvSeq * contour = 0; &CvSeq *contmax = 0; &int mode = CV_RETR_EXTERNAL; &cvShowImage( &src&, pImg ); &//为轮廓显示图像申请空间 &//3通道图像,以便用彩色显示 &pContourImg = cvCreateImage(cvGetSize(pImg), &&IPL_DEPTH_8U, &&3); &//copy source image and convert it to BGR image &cvCvtColor(pImg, pContourImg, CV_GRAY2BGR); &//查找contour &cvFindContours( pImg, storage, &contour, sizeof(CvContour), &&mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); &//将轮廓画出&&& &cvDrawContours(pContourImg, contour, &&CV_RGB(255,0,0), CV_RGB(255, 0, 0), &&2, 2, 8, cvPoint(0,0)); &int area,maxArea = 10;//设面积最大值大于10Pixel &for(;contour = contour-&h_next) &{ &&area = fabs(cvContourArea( contour, CV_WHOLE_SEQ )); //获取当前轮廓面积 &&printf(&area == %lf\n&, area); &&if(area & maxArea) &&{ &&&contmax = &&&maxArea = &&} &} &CvRect aRect = cvBoundingRect( contmax, 0 ); &cvSetImageROI( pContourImg,aRect); &//显示图像 &cvShowImage( &contour&, pContourImg ); &cvSaveImage(&e:/contour.jpg&,pContourImg); &cvWaitKey(0);
&//销毁窗口 &cvDestroyWindow( &src& ); &cvDestroyWindow( &contour& ); &//释放图像 &cvReleaseImage( &pImg ); &cvReleaseImage( &pContourImg ); &cvReleaseMemStorage(&storage);
&return 0; }
处理前的连通域推荐:
对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域。 代码 view plain copy to clipboard print
CvSeq* conto
处理后的连通域
a.&二值化&&
b.&得到轮廓的个数&&
c.&将面积小于100的轮廓删除&&
d.&将宽、高&比例小于1的轮廓删除&&
e.&把面积最大的米粒用红色框框画出来&&
a. 二值化 b. 得到轮廓的个数 c. 将面积小于100的轮廓删除 d. 将宽、高 比例小于1的轮廓删除 e. 把面积最大的米粒用红色框框画出来
#include&&stdafx.h& &&
#include&&cv.h& &&
#include&&highgui.h& &&
int&main(&int&argc,&char**&argv&)&&
&&&&IplImage*&&&
&&&&src=cvLoadImage(&D:/Demo.jpg&,CV_LOAD_IMAGE_GRAYSCALE);&&
&&&&IplImage*&dst&=&cvCreateImage(&cvGetSize(src),&8,&3&);&&
&&&&CvMemStorage*&storage&=&cvCreateMemStorage(0);&&
&&&&CvSeq*&contour&=&0;&&
&&&&cvThreshold(&src,&src,120,&255,&CV_THRESH_BINARY&);//二值化 &&
&&&&cvNamedWindow(&&Source&,&1&);&&
&&&&cvShowImage(&&Source&,&src&);&&
&&&&//提取轮廓 &&
&&&&cvFindContours(&src,&storage,&&contour,&sizeof(CvContour),&CV_RETR_CCOMP,&CV_CHAIN_APPROX_SIMPLE&);&&
&&&&cvZero(&dst&);//清空数组 &&
&&&&CvSeq*&_contour&=&&&
&&&&double&maxarea=0;&&
&&&&double&minarea=100;&&
&&&&int&n=-1,m=0;//n为面积最大轮廓索引,m为迭代索引 &&
&&&&for(&;&contour&!=&0;&contour&=&contour-&h_next&)&&
&&&&&&&&double&tmparea=fabs(cvContourArea(contour));&&
&&&&&&&&if(tmparea&&&minarea)&&&
&&&&&&&&{&&
&&&&&&&&&&&&cvSeqRemove(contour,0);&//删除面积小于设定值的轮廓 &&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&CvRect&aRect&=&cvBoundingRect(&contour,&0&);&&&
&&&&&&&&if&((aRect.width/aRect.height)&1)&&
&&&&&&&&{&&
&&&&&&&&&&&&cvSeqRemove(contour,0);&//删除宽高比例小于设定值的轮廓 &&
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&if(tmparea&&&maxarea)&&
&&&&&&&&{&&
&&&&&&&&&&&&maxarea&=&&&
&&&&&&&&&&&&n=m;&&
&&&&&&&&}&&
&&&&&&&&m++;&&
&&&&&&&&//&&CvScalar&color&=&CV_RGB(&rand()&255,&rand()&255,&rand()&255&);//创建一个色彩值 &&
&&&&&&&&CvScalar&color&=&CV_RGB(&0,&255,255&);&&
&&&&&&&&//max_level&绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。 &&
&&&&&&&&//如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。 &&
&&&&&&&&//如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓。& &&
&&&&&&&&cvDrawContours(&dst,&contour,&color,&color,&-1,&1,&8&);//绘制外部和内部的轮廓 &&
&&&&contour&=_&/*int&k=0;*/&&
&&&&int&count=0;&&
&&&&for(&;&contour&!=&0;&contour&=&contour-&h_next&)&&
&&&&&&&&count++;&&
&&&&&&&&double&tmparea=fabs(cvContourArea(contour));&&
&&&&&&&&if&(tmparea==maxarea&/*k==n*/)&&
&&&&&&&&{&&
&&&&&&&&&&&&CvScalar&color&=&CV_RGB(&255,&0,&0);&&
&&&&&&&&&&&&cvDrawContours(&dst,&contour,&color,&color,&-1,&1,&8&);&&
&&&&&&&&}&&
&&&&&&&&/*k++;*/&&
&&&&printf(&The&total&number&of&contours&is:%d&,count);&&
&&&&cvNamedWindow(&&Components&,&1&);&&
&&&&cvShowImage(&&Components&,&dst&);&&
&&&&cvWaitKey(0);&&
&&&&cvDestroyWindow(&&Source&&);&&
&&&&cvReleaseImage(&src);&&
&&&&cvDestroyWindow(&&Components&&);&&
&&&&cvReleaseImage(&dst);&&
&&&&return&0;&&
推荐:OpenCV_连通区域分析(Connected Component Analysis/Labeling) 【摘要】 本文主要介绍在CVPR和图像处理领域中较为常用的一种图像区域(Blob)提取的方法——连
用OpenCv找出最大连通域,并对其进行连通域进行ROI ( 21:53:33) 转载▼ 标签: 连通域 标定 opencv it 分类: OpenCV   由于项目需要,要对图像中的最大连通域进行标定,并且存储。
相关阅读排行
相关内容推荐
请激活账号
为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。
您的注册邮箱:
如果您没有收到激活邮件,请注意检查垃圾箱。

我要回帖

更多关于 opencv 提取连通区域 的文章

 

随机推荐