【问题标题】:OpenCV findContours allways finds two contours for every objectOpenCV findContours 总是为每个对象找到两个轮廓
【发布时间】:2012-07-13 05:53:32
【问题描述】:

我刚刚写了一个小程序,它在颜色阈值二值图像中搜索轮廓,该图像在阈值化后用 canny 处理,但不知何故,它总是为图像中的每个对象找到两个轮廓。

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

http://img831.imageshack.us/img831/3641/doubleframe2.png

这里只绘制了最大的轮廓两次,但每隔一个轮廓就会随机发生一次。 我只想为每个对象提供一个轮廓,我该如何实现? :/

更新:

由 findContours 方法填充的轮廓向量的大小为 8,而它的大小应该仅为 4。

更新 2:

这是来自 kinect 的 rgb 输入图像 http://img405.imageshack.us/img405/9761/inputimage.jpg 对于颜色阈值,我使用了以下方法

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

接着是一个大小为 1 的 rect 元素的腐蚀 + 膨胀。

【问题讨论】:

  • 请提供原图链接。
  • 完成。不得不删除程序的图像,因为我只能发布 2 个链接:/.
  • 你为什么在找到轮廓之前就选择精明?为什么不直接在阈值图像上找到轮廓?
  • 另外,检查你获得的轮廓数。

标签: c++ opencv


【解决方案1】:

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

当我计算它的面积时,它们有一个非常小的变化,值在 '3' 左右(例如,最大的正方形检测到两个轮廓,区域为 9105.5 和 9108.5 ),由于我提到的原因,这很可能发生。 (所以它们很难区分)

如果你找到轮廓而不找到精巧的边缘,问题就可以解决。即直接从阈值图像中找到轮廓。它会给你更准确的答案。

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

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

【讨论】:

  • 不知道我可以直接在阈值图像上使用 findContours,现在效果更好。谢谢! :)
  • 最欢迎!如果它解决了您的问题,您可以接受答案并关闭此会话。
猜你喜欢
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多