我有一个 python 程序的问题,我想在 C 中计算以下示例中的硬币,并将其转换为 python。
Coins contours
到目前为止,我无法找到 C 行的等价物:
sprintf(msg, "Found %d coins.", contours.size());
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))
最佳答案
当您使用 cv.FindContours 函数查找轮廓时,它会返回一个 cvSeq 对象。它返回多个链接序列,您必须遍历它们以获取所有轮廓。
所以起初,指针只指向第一个轮廓,比如你的第一枚硬币。当您使用 len(contour)
,它只返回该轮廓内的点,即您的第一枚硬币的点。所以现在你可以想象你是如何得到 154 的。这不是轮廓的数量,而是轮廓内的点数。要查看这些要点,print list(contour)
当你在图像上画出这些点时,你可以看到它们都构成了硬币的边界。
现在要选择下一个轮廓或下一个硬币,请使用 contour = contour.h_next()
等等。
我认为没有内置函数可以返回轮廓数,除非您遍历轮廓并对其进行计数。
试试这个并检查它是否打印 4 个 cvSeq 对象:
while contours:
print contours
contours = contours.h_next()
我已经在这里解释了所有这些事情:What does result of 'list(contour)' denote?cv2
界面更简单更好。在那里,轮廓作为 Numpy 数组列表返回,您可以使用 len(contour) 来查找轮廓的数量。cv
接口(interface)很快就会过时。所以最好迁移到新的cv2
界面。
https://stackoverflow.com/questions/13905499/