OpenCV-查找或访问不由bg包围的形状轮廓,仅由轮廓分隔 我一直在使用OpenCV的代码> FordStutial来寻找一个非常简单的背景中的单个轮廓的轮廓(我想使用C++语法)。然而,它不断地使其轮廓成为轮廓,而不是形状本身。我想这是因为Canny的白色边缘没有使形状闭合

OpenCV-查找或访问不由bg包围的形状轮廓,仅由轮廓分隔 我一直在使用OpenCV的代码> FordStutial来寻找一个非常简单的背景中的单个轮廓的轮廓(我想使用C++语法)。然而,它不断地使其轮廓成为轮廓,而不是形状本身。我想这是因为Canny的白色边缘没有使形状闭合,c++,image-processing,opencv,contour,C++,Image Processing,Opencv,Contour,案例A:形状由图像的边缘确定 (这不是实际的输入图像,而是用于说明此问题的更简单的输入图像。) 案例B:形状周围的背景 我使用的主要功能有: findContours( grayImage, contours, hierarchy, RETR_LIST,CHAIN_APPROX_SIMPLE); approxPolyDP(Mat(contours.at(largestContourIndex)),poly,3,true); drawContours(output, contours, lar

案例A:形状由图像的边缘确定 (这不是实际的输入图像,而是用于说明此问题的更简单的输入图像。)

案例B:形状周围的背景

我使用的主要功能有:

findContours( grayImage, contours, hierarchy, RETR_LIST,CHAIN_APPROX_SIMPLE);
approxPolyDP(Mat(contours.at(largestContourIndex)),poly,3,true);
drawContours(output, contours, largestContourIndex, RGB(250,0,100), -1, 8, hierarchy, 0, Point() );
编辑:跳过边缘检测可以得到我需要的轮廓,但我需要得到最好的轮廓近似值


提前感谢。

您是否尝试过使用形态学操作

如果你的基本问题是你得到的轮廓是在物体的外部,而不是内部,尤其是如果你的物体是由如此清晰且大部分是规则形状组成的,那么形态学可能会有所帮助

我知道OpenCV实现了膨胀和腐蚀,以及打开和关闭操作。在您的情况下,一个可能有效的非常简单的方法就是稍微腐蚀形状(可能是1-2-3次迭代),然后完全按照您已经在做的事情来做。希望你能得到被侵蚀形状的外部轮廓,那应该是原始形状的内部轮廓


我认为OpenCV实际上实现了一些更复杂的形态学,但一如既往,请先尝试一些简单的东西:D

在我看来,您正在寻找的轮廓可能被检测到,但您没有使用它。而是使用最大的轮廓。尝试一个接一个地绘制所有找到的等高线,看看它是否在那里


如果不是,请尝试反转canny图像并重复此过程。

我仍然没有找到无法获得形状轮廓的原因,但我找到了解决方法。在进行腐蚀和膨胀后,我基本上必须在输入图像的最外层像素上绘制一个边框或矩形,以便背景环绕形状

rectangle(input,Point(0,0),Point(input.cols-1,input.rows-1),Scalar(0,0,0),1,8,0);

。。。因此,让Canny画一个封闭的外形轮廓,并给我想要的外形轮廓。我仍在尝试像@dvhamme所建议的那样成功地反转Canny的输出,但它仍然给了我错误。如果有人指出如何正确获取或访问形状轮廓会更好,但感谢大家的帮助。

我看到你在回答我的问题后编辑了你的帖子。如果你在我的回答上留下一条评论,解释它是否有用,如果没有,为什么这种方法不起作用(即你尝试时发生了什么),那就好了。事实上,我以前试过你的方法,还有其他几种方法。我只是犹豫了一下,不想把这个问题复杂化,也不想回答。将很快作出答复和编辑。谢谢你的帮助。我实际上对输入图像进行了腐蚀和膨胀,并使用轨迹栏来控制每个图像的内核。我知道您的方法允许我消除形状边缘附近的部分。但我必须先使用边缘检测,然后才能找到它的轮廓,以改进轮廓近似。做边缘检测仍然会给我一个有轮廓的黑色图像。基本上有3组像素-(1)背景,(2)白色轮廓,(3)形状,这就引出了我的主要问题-为什么OpenCV不将第3组包围在轮廓中?这是我所期望的,但我确实尝试过一个接一个地绘制轮廓,并改变轮廓模式和轮廓方法,这些都是OpenCV的findContour的参数。我尝试了我的初始阈值,但形成的轮廓总是围绕着轮廓。我试试你的建议。谢谢。我转载了你的文章,把这张精明的图片翻过来也没用。但是,使用
threshold()
分割对象,然后运行
findContours()
。轮廓检测器显然不是在线条检测后使用的,但在二值分割图像上效果很好,不管物体是否接触到边缘。谢谢你的时间!一旦我回到这个项目,我会记住尝试
threshold()
。我一直在做一些类似于
inRange(src_-Mat,min,max,dst_-Mat)
的事情,从那以后就再也没有碰过。