1

我有一个 python 程序的问题,我想在 C 中计算以下示例中的硬币,并将其转换为 python。

硬币轮廓

到目前为止,我无法找到 C 行的等价物:

sprintf(msg, "Found %d coins.", contours.size());

我的主要问题是“contours.size()”,我尝试用 len() 替换该代码,但它给了我 154 而不是 4,请参见下面的代码:

contours = cv.FindContours(cv.CloneImage(image_threshed), cv.CreateMemStorage(0), cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE)

cv.DrawContours(image, contours, cv.RGB(255,0,0), cv.RGB(0,255,55), 2,1,8)

NumeroContornos = str(len(contours))

font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, .5, .5, 0, 1, 8)
cv.PutText(image,NumeroContornos, (5,17),font, cv.RGB(250,0,0))

我将不胜感激任何帮助。

4

1 回答 1

2

当您使用 cv.FindContours 函数查找轮廓时,它会返回一个 cvSeq 对象。它返回多个链接序列,您必须遍历它们以获取所有轮廓。

所以起初,指针只指向第一个轮廓,比如你的第一枚硬币。当您使用len(contour)时,它只返回该轮廓内的点,即您的第一枚硬币的点。所以现在你可以想象你是如何得到 154 的。这不是轮廓的数量,而是轮廓内的点数。看到这些点,print list(contour)当你在图像上画出这些点时,你可以看到它们都构成了一枚硬币的边界。

现在选择下一个轮廓,或下一个硬币,使用contour = contour.h_next()等等。

我认为没有内置函数可以返回轮廓数,除非您遍历轮廓并对其进行计数。

试试这个并检查它是否打印 4 个 cvSeq 对象:

while contours:
    print contours
    contours = contours.h_next()

我在这里解释了所有这些事情:'list(contour)'的结果是什么意思?

相反,我建议您使用cv2更简单更好的新界面。在那里,轮廓作为 Numpy 数组列表返回,您可以使用 len(contour) 来查找轮廓的数量。

您可以在此处找到 cv 和 cv2 之间差异的简要说明:所有这些 OpenCV Python 接口之间有什么不同?

cv界面很快就会过时。所以最好迁移到新cv2界面。

于 2012-12-16T22:18:14.180 回答