【发布时间】: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后返回不同的结果。这可能是罪魁祸首。