为啥 opencv 中的 FindContours 函数会在如下图像中找到两个轮廓而不是一个?

Posted

技术标签:

【中文标题】为啥 opencv 中的 FindContours 函数会在如下图像中找到两个轮廓而不是一个?【英文标题】:Why does FindContours function in opencv find two contours instead of one in an image as below?为什么 opencv 中的 FindContours 函数会在如下图像中找到两个轮廓而不是一个? 【发布时间】:2011-09-02 20:02:06 【问题描述】:

输入图像 -- http://i.imgur.com/sLoqh.png 绘制轮廓的凸包的输出图像 -- http://i.imgur.com/AaNJY.png

对于如何获得一个轮廓的任何帮助将不胜感激?

【问题讨论】:

显示一些代码。您如何称呼 FindCountours?这可以通过使用正确的参数调用函数来解决:) 【参考方案1】:

将图像检索为一个轮廓的技巧似乎是在执行cvFindContours之前使用Canny处理图像。

IplImage* src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE);

IplImage* cc_img = cvCreateImage( cvGetSize(src), src->depth, 3 );
cvSetZero(cc_img);
CvScalar(ext_color);

CvMemStorage *mem;
mem = cvCreateMemStorage(0);
CvSeq *contours = 0;

// edges returned by Canny might have small gaps between them, which causes some problems during contour detection
// Simplest way to solve this s to "dilate" the image.
cvCanny(src, src, 10, 50, 3); 
cvShowImage("Tutorial", src);
cvWaitKey(0);

int n = cvFindContours( src, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

CvSeq* ptr = 0;
for (ptr = contours; ptr != NULL; ptr = ptr->h_next)
   
    ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours
    cvDrawContours(cc_img, ptr, ext_color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
   

cvNamedWindow("Tutorial");
cvShowImage("Tutorial", cc_img);
//cvSaveImage("out.png", cc_img);

cvWaitKey(0);

输出:

【讨论】:

您好,感谢您的回复。我使用opencv android。我最初执行双边过滤器(Imgproc.bilateralFilter(inputMatrix,bilateralFilteredMatrix,3,50,50))和MorphologyEx操作(MORPH_OPEN和MORPH_CLOSE),然后在图像上执行Canny。我看到 Opencv 在那之后返回了我 2 个轮廓。但是,如果我不进行初始降噪并且只按照您的方法进行 Canny,它会返回一个轮廓吗?!但是对于其他有噪声的实时图像,我需要应用这些过滤器。为什么 FindContours 在应用过滤器后返回 2 个轮廓? 其中一个过滤器可能会将图像分开,在符号的绘制中创建一个间隙,小到足以让 `cvContours` 认为它正在处理 2 个单独的组件。要么是这样,要么在您的逻辑实施中可能存在其他问题,但我们无法帮助您解决这个问题,因为这个问题没有代码。

以上是关于为啥 opencv 中的 FindContours 函数会在如下图像中找到两个轮廓而不是一个?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中的findContours崩溃编译器

OpenCV findContours 堆栈溢出

C++ OpenCV:检测两行而不是一行(Canny & findContours)

Python-OpenCV中的图像轮廓检测

findContours:OpenCV 已触发断点

Opencv 的“findContours”错误:线程停止,代码为 -1073740777