自学opencv过程中轮廓学习时遇到的几个问题

过程中遇到的几个问题:

○cvFindContours()方法从二值图像中寻找轮廓。因此此方法处理的图像可以是从cvCanny()函数得到的有边缘像素的图像,或者从cvThreshold()及cvAdaptiveThreshold()得到的图像,这时的边缘是正和负区域之间的边界。

 

既然在查找之前,我们需要将彩色图像转换成灰度图像,然后再将灰度图像转换成二值图像。代码如下所示:

1  CvSeq *contours = 0;

2  cvCvtColor(src,dst,CV_BGR2GRAY);//将源图像进行灰度化

3cvThreshold(dst,dst,f_thresh,255,CV_THRESH_BINARY);//二值化阈值 虽然第一个参数是const,但仍可以更改dst

4  cvFindContours(dst,f_storage,&contours);//查找轮廓;

 

○对于用CvBox2D求轮廓的外界矩形,怀疑求解到的整个图片的外接框问题(已解决)

分析:

      1)首先确定是否误将图片的外边框当做轮廓来处理了。

     这个问题确定起来比较简单,你可以在你的程序中将获取的轮廓在原始图像上绘制出来,这样很直观的就能确定是否存在这个问题。

    2)如果存在将图片的外边框当做轮廓来处理了,需要分析出现这种问题的原因。

对于该问题,可能是在使用cvThreshold时threshold_type这个参数选取存在一些不合适之处。

cvThreshold这个函数中的threshold_type参数问题解决

函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由threshold_type 确定。

形式:void cvThreshold( const CvArr* src,CvArr* dst, double threshold, double max_value, int threshold_type );

最后是threshold_type参数的意义:数组实际上是一个映射表,它指明了当差异值小于<对应于参数CV_THRESH_BINARY>或大于<对应于参数CV_THRESH_BINARY>-idelta时输出像素值为0,大于(小于)-idelta时输出像素值为255。由于差异值可以是负值,而数组的下标却不行,所以作者将tab数组的下标偏移了+255,即当差异值为-10时,对应的tab数组下标为-10+255=245;差异为+10时,下标为265。
至于参数idelta(param1),如果取得比较小,则所提取边缘就粗,取得大,边缘就细。另外如果取的是正值,那么提取的将是物体的内边缘,即所有边缘上的点都处于物体内部,并且平滑区域的像素值为255,边缘区域为0;如果取的是负值,提取的就是外边缘,此边缘位于物体外部,平滑区域的像素值为0,边缘区域为255。另外阈值类型CV_THRESH_BINARY / CV_THRESH_BINARY_INV选取的不同也会影响平滑区域和边缘区域的像素值,前面的陈述假定的都是CV_THRESH_BINARY类型。

 

你可能感兴趣的:(opencv学习,opencv,轮廓处理,cvThreshold函数)