C++和Python之间的轮廓差异

6

我目前正在使用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)

为了展示结果,我在不同的轮廓上使用了随机颜色的drawcontours: enter image description here 如您所见,在c++中每个形状轮廓都被正确检测出来,尽管不是完美的,而在Python中我有更多的轮廓。每次一条线断开一点,就会检测到一个新的轮廓。有什么办法可以解决这个问题吗?谢谢!

1
我想祝贺你。这是我长时间以来看到的最好的OpenCV问题。继续保持! - Aurelius
1
我嗅到了一个bug,你可能需要上传你的测试图片。如果有其他人用Python(我只用C++)可以验证它,那么你应该把它带到OpenCV论坛上。 - Sebastian Schmitz
为什么不在这里提交问题:http://code.opencv.org/projects/opencv/issues - marol
2
差异可能是findContours中的错误,但也可能是之前发生的错误导致的。Canny、cvtContours甚至imread都可能是罪魁祸首。请验证在C++和Python中_src、gray和bw是否相同(您可以使用一些简单的函数,如sum()进行健全性检查)。 - Michael Burdinov
@MichaelBurdinov,我刚做了一个快速的检查。在应用Canny之后,sum()返回不同的结果。这可能是罪魁祸首。 - Aurelius
@MichaelBurdinov _src和gray是相同的,但bw不同,所以我认为Canny算子是两个结果之间差异的原因。如果可以帮助的话,这就是我正在尝试解释的图像:http://hpics.li/2cb0ca3(我之前发布的部分仅为顶部)。 值得一提的是,我想获取形状,理想情况下只获取每个形状的角落,以便我可以在3D编辑器中自动绘制地面图。 - AdNB
1个回答

2
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参数。即使设置相同的参数,我仍然会得到不同的结果。 - Aurelius
是的,无论我是否明确指定apertureSize和L2gradient,结果都是一样的。 - AdNB
你能发布测试图片吗?也许我们可以想出一些解决方案。 - Adam Kosiorek
@AdamKosiorek 这是它的链接:http://hpics.li/2cb0ca3。我只在这里发布了上半部分。 - AdNB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接