Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用cv::findContours从二进制遮罩中查找最大面积对象失败,因为轮廓未闭合。如何预防?_C++_Opencv_Opencv Contour - Fatal编程技术网

C++ 使用cv::findContours从二进制遮罩中查找最大面积对象失败,因为轮廓未闭合。如何预防?

C++ 使用cv::findContours从二进制遮罩中查找最大面积对象失败,因为轮廓未闭合。如何预防?,c++,opencv,opencv-contour,C++,Opencv,Opencv Contour,我试图在视频源中基于其形状特征(如面积、轮廓长度等)执行几乎黑色的对象检测,但在二值遮罩中检测轮廓时遇到问题 有时,即使对象不改变形状,并且轮廓是从仅包含一个紧凑斑点的简单遮罩导出的,但轮廓不是闭合的,我可以看出,因为我使用CV_填充选项显示它,并且对于许多帧,轮廓是填充的,由于计算出的面积实际上并不可靠,所以该值会降低到几个像素 我还注意到,当物体的轮廓没有闭合时,其长度大约是预期长度的2倍,这是有意义的 为什么简单斑点的轮廓有时是开放的,有时是封闭的,我如何强迫它们总是封闭的?我已经尝试了凸

我试图在视频源中基于其形状特征(如面积、轮廓长度等)执行几乎黑色的对象检测,但在二值遮罩中检测轮廓时遇到问题

有时,即使对象不改变形状,并且轮廓是从仅包含一个紧凑斑点的简单遮罩导出的,但轮廓不是闭合的,我可以看出,因为我使用CV_填充选项显示它,并且对于许多帧,轮廓是填充的,由于计算出的面积实际上并不可靠,所以该值会降低到几个像素

我还注意到,当物体的轮廓没有闭合时,其长度大约是预期长度的2倍,这是有意义的

为什么简单斑点的轮廓有时是开放的,有时是封闭的,我如何强迫它们总是封闭的?我已经尝试了凸面外壳,也复制了轮廓的第一个点到它的末端,但没有成功

我的方法步骤如下:

将图像转换为灰度 执行阈值、腐蚀和膨胀以消除噪声并改善形状 使用Canny边缘检测器仅获取边缘 使用FindContour获取轮廓及其面积: 使用arcLength计算轮廓和其他特征的长度。 使用Canny边缘检测器仅获取边缘 这是一个典型的错误。在步骤2之后和过程中,我假设您有一个二值图像,即一个黑色图像,带有一束填充的白色斑点,表示您要查找的区域。这正是cv::findContours的工作原理

当你做边缘检测时,你实际上会把那些漂亮的填充区域转换成一堆非常细的长的线,可能但不一定是封闭的线包围着你以前的区域,这会把一切搞砸。因此,cv::findContours将返回一组非常薄的轮廓。这些轮廓实际上也是闭合的,因为它们表示一个闭合的多边形,最后一个点连接回第一个点,只是这个多边形围绕着由边缘检测产生的细线,这解释了为什么它们的面积非常小,周长是预期的两倍。它基本上不会将边缘检测产生的线条视为实际轮廓,而不是要查找其边界轮廓的非常薄的区域,这可能不是您想要的

如果这些边界线是闭合的,并且您仅检索外部轮廓(例如,使用CV_RETR_EXTERNAL),您可能会得到与您期望的大致相同的正确面积轮廓,但这并不能保证,而且很容易出错


因此,简单的解决方案是放弃Canny边缘检测步骤,直接处理正确的二值图像,就像cv::FindOntours通常打算做的那样。

不解释它,而是放置一些有问题的图像和您使用的代码为什么使用Canny边缘检测器?在形状上使用findContours会起作用吗?@Miki:我不能放图像,因为我没有足够的声誉。雨果:我不知道为什么,但在我的电脑VS2012+Opencv2.4上,FindContentours崩溃了这个程序,尽管我在正确的图像上使用了阈值操作的黑白结果。奇怪的是,它对Canny detector的结果有效,但有问题。将它们放在一些公共场所,如imgur,并共享公共链接没有代码和图像我们无能为力。。。