【问题标题】:Contours differences between C++ and PythonC++ 和 Python 之间的轮廓差异
【发布时间】:2014-07-31 12:33:38
【问题描述】:

我目前正在使用 opencv 来检测形状上的简单计数。起初,我使用 c++ 并且一切正常。现在,我正在尝试对 Python 做同样的事情,因为我需要在线使用它,而轮廓检测似乎也无法正常工作。

这是我的 C++ 代码:

_src = cv::imread(_imagePath);
cv::Mat gray;
cv::cvtColor(_src, gray, CV_BGR2GRAY);
cv::Mat bw;
cv::Canny(gray, bw, 0, 50, 5);
cv::findContours(bw.clone(), allCountours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

如你所见,很简单,同样的代码是 Python 是:

self._src = cv2.imread(self._imagePath)
gray = cv2.cvtColor(self._src, cv2.COLOR_BGR2GRAY)
bw = cv2.Canny(gray, 0, 50, 5)
allCountours, hierarchy = cv2.findContours(bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

为了显示结果,我在不同的轮廓上使用了带有随机颜色的绘制轮廓:

如您所见,在 c++ 中,每个形状轮廓都被正确检测到,尽管它并不完美,而在 Python 中,我有更多的轮廓。每当一条线稍微中断时,就会检测到一个新的轮廓。知道如何解决这个问题吗?谢谢你!

【问题讨论】:

  • 恭喜你。这是我很长时间以来见过的最好的 OpenCV 问题。继续加油!
  • 我闻到了一个错误,您可能还想上传您的测试图像。如果其他人使用 Python(我只使用 c++)可以验证它,你应该把它带到 opencv 论坛。
  • 为什么不在这里提出问题:code.opencv.org/projects/opencv/issues
  • 差异可能是 findContours 中的错误导致的,但也可能是之前发生的错误的结果。 Canny、cvtContours 甚至 imread 都可能是罪魁祸首。请验证 _src、gray 和 bw 在 C++ 和 Python 中是否相同(您可以使用一些简单的函数,如 sum() 进行完整性检查)。
  • @MichaelBurdinov 我刚刚做了一个快速的健全性检查。 sum() 应用Canny 后返回不同的结果。这可能是罪魁祸首。

标签: python c++ opencv


【解决方案1】:

C++函数签名如下: void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )

对于 Python,它是: cv.Canny(image, edges, threshold1, threshold2, aperture_size=3) → None

如您所见,最后一个参数在 Python 中不可用。它可能设置为true。你能试试吗?

【讨论】:

  • 这是一个很好的直觉,但cv2.Canny() 文档确实显示了L2gradient 参数。即使此参数设置相同,我仍然会得到不同的结果。
  • 是的,无论我是否明确设置了apertureSize和L2gradient,结果都是一样的。
  • 你能发布测试图像吗?也许我们可以解决一些问题。
  • @AdamKosiorek 就是这个:hpics.li/2cb0ca3。我这里只贴上半部分。
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多