Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ OpenCV findContours始终为每个对象查找两个轮廓_C++_Opencv - Fatal编程技术网

C++ OpenCV findContours始终为每个对象查找两个轮廓

C++ OpenCV findContours始终为每个对象查找两个轮廓,c++,opencv,C++,Opencv,我刚刚写了一个小程序,在一个彩色阈值二值图像中搜索轮廓,这个二值图像在阈值化后用canny进行处理,但是它总是为图像中的每个对象找到两个轮廓 在绘制找到的轮廓的右下角图像中,可以看到最大轮廓绘制了两次,两个轮廓之间有一点偏移。下一幅图像显示了此图像的详细视图 这里只画了两次最大的轮廓,但每画一次轮廓都是随机的。 我只希望每个对象都有一个轮廓,我如何才能做到这一点/ 更新: findContours方法填充的轮廓向量的大小为8,其中它的大小应仅为4 更新2:这是来自kinect的rgb输入图像

我刚刚写了一个小程序,在一个彩色阈值二值图像中搜索轮廓,这个二值图像在阈值化后用canny进行处理,但是它总是为图像中的每个对象找到两个轮廓

在绘制找到的轮廓的右下角图像中,可以看到最大轮廓绘制了两次,两个轮廓之间有一点偏移。下一幅图像显示了此图像的详细视图

这里只画了两次最大的轮廓,但每画一次轮廓都是随机的。 我只希望每个对象都有一个轮廓,我如何才能做到这一点/

更新:

findContours方法填充的轮廓向量的大小为8,其中它的大小应仅为4

更新2:

这是来自kinect的rgb输入图像 对于颜色阈值,我使用了以下方法

cv::cvtColor(in, out, CV_BGR2HSV);
cv::inRange(out,
            cv::Scalar(25, 131, 97),
            cv::Scalar(35, 220, 217),
            out);

然后是侵蚀+膨胀,矩形元素的大小为1。

我认为问题最有可能是因为当你找到边,然后找到这些边的轮廓时,有一个外边界和内边界。所以openCV将两者都作为轮廓并绘制

当我计算其面积时,它们的值变化非常小,大约为'3'(例如,最大的正方形检测到两个面积分别为9105.5和9108.5)的等高线,这很可能是由于我提到的原因。(因此很难区分)

如果您找到轮廓而没有找到精明的边,则问题可以得到解决。ie直接从阈值图像中找到轮廓。它会给你更准确的答案

在第一种情况下(在canny之后),我得到了36个轮廓,而在第二种情况下,我只得到了22个轮廓


试试看,希望它能解决问题

请提供原始图像的链接。完成。我不得不删除程序的图像,因为我只能发布2个链接:/。为什么在找到轮廓之前你选择canny?为什么不直接在阈值图像上查找轮廓呢?另外,请检查您获得的轮廓数。我不知道我可以直接在阈值图像上使用findContours,现在效果好多了。谢谢!:)非常欢迎!如果它解决了您的问题,您可以接受答案并关闭此会话。