新手求助,如何用OpenCV去除小块的分散区域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新手求助,如何用OpenCV去除小块的分散区域相关的知识,希望对你有一定的参考价值。

参考技术A // m_imgFeature为黑白目标图像,白色为前景,黑色为背景
// 注意此函数会修改m_imgFeature内容。若其不可更改,应另建立副本
// 1. count contour
CvMemStorage* storage = 0;
storage = cvCreateMemStorage(0); //开辟默认大小的空间
CvSeq* contour = 0;
cvFindContours( m_imgFeature, storage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // 查找外边缘

int num = 0;
for( ; contour != 0; contour = contour->h_next )

CvRect rect;
rect = cvBoundingRect(contour,0); // 转化为点列
m_arrLine.SetSize(num+1);
m_arrLine.GetAt(num).SetLine(rect.x,rect.x+rect.width ,rect.y,rect.y+rect.height);
num = num+1;
for( i = 0; i < contour->total; i++ )

CvPoint* line = (CvPoint*)cvGetSeqElem(contour,i);
cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );



// .release
cvReleaseMemStorage(&storage);
//////////////////end of code////////////////////////////
cvFindContours的第5个参数
CV_RETR_EXTERNAL 查找外边缘,各边缘以指针h_next相连
CV_RETR_LIST 查找所有边缘(包含内部空洞),各边缘以指针h_next相连
CV_RETR_CCOMP 查找所有边缘(包含内部空洞)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
转自:

cvFindContours函数使用说明
函数cvFindContours从二值图像中检索轮廓,并返回检测到的轮廓的个数。first_contour的值由函数填充返回,它的值将为第一个外轮廓的指针,当没有轮廓被检测到时为NULL。其它轮廓可以使用h_next和v_next连接,从first_contour到达。

int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );

image
8比特单通道的源二值图像。非零像素作为1处理,0像素保存不变。从一个灰度图像得到二值图像的函数有:cvThreshold,cvAdaptiveThreshold和cvCanny。

storage
返回轮廓的容器。

first_contour
输出参数,用于存储指向第一个外接轮廓。

header_size
header序列的尺寸.如果选择method = CV_CHAIN_CODE, 则header_size >= sizeof(CvChain);其他,则
header_size >= sizeof(CvContour)。

mode
检索模式,可取值如下:
CV_RETR_EXTERNAL:只检索最外面的轮廓;
CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。

method
边缘近似方法(除了CV_RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)。可取值如下:
CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法
的一种。
CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。

offset
偏移量,用于移动所有轮廓点。当轮廓是从图像的ROI提取的,并且需要在整个图像中分析时,这个参数将很有用。

讨论部分cvDrawContours中的案例显示了任何使用轮廓检测连通区域。轮廓可以用于形状分析和目标识别——可以参考文件夹OpenCV sample中的squares.c。

求助:如何用matlab测量中国地图面积

你得拿到一个中国地图的二值图
白色为地图内部,黑色是外国
然后找像素为1的点,找到后累加
参考技术A 根据像素的颜色计算吧 参考技术B 不要说自己是菜鸟!
最后的for里那个bwI怎么之前没有定义或计算过程,凭空出来的,是不是这里错了
请参考

以上是关于新手求助,如何用OpenCV去除小块的分散区域的主要内容,如果未能解决你的问题,请参考以下文章

新手求助,如何用OpenCV去除小块的分散区域

新手,怎么用OpenCV去除小块的分散区域

如何用js更改tr的背景颜色 新手求助

如何用opencv实现任意联通区域的最大内接圆

OpenCV新手入门,如何用它平移缩放和旋转图片

如何用chrome去除广告