python - 在opencv中计算python中的轮廓

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

Coins contours

到目前为止,我无法找到 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))

我将不胜感激任何帮助。

最佳答案

当您使用 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 和 cv2 之间差异的简要说明:What is different between all these OpenCV Python interfaces?
cv接口(interface)很快就会过时。所以最好迁移到新的cv2界面。

https://stackoverflow.com/questions/13905499/

相关文章:

string - 为什么将字符串指针转换为void指针然后返回会导致字符串数据消失? (Opencv

opencv - 密码本背景减法-一切都爆炸成白色

c# - 使用 SURF 匹配 OpenCV\EmguCV 中的图像

image-processing - OpenCV中是否有其他方法可以进行形态学操作?

opencv - OpenCV中的实时人脸检测

matlab - 不裁剪的图像重映射

objective-c - iOS 中的 CVSurf (OpenCV) 功能

php - 如何在 docker 上运行 PHP 脚本?

sql-server - 在 Azure Data Studio 中还原数据库备份时出现错误 "co

opencv - OPEN CV程序执行错误?