在opencv中用python计算轮廓

在opencv中用python计算轮廓,python,opencv,count,Python,Opencv,Count,我在python程序中遇到了一个问题,我想用C语言将下面的例子中的硬币数转换成python 到目前为止,我无法找到C线的等效物: sprintf(msg, "Found %d coins.", contours.size()); 我的主要问题是“contours.size()”,我试图用len()替换该代码,但它给出的数字是154,而不是4,请参见下面的代码: contours = cv.FindContours(cv.CloneImage(image_threshed), cv.Creat

我在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))

我将感谢任何帮助

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

所以首先,指针只指向第一个轮廓,比如说你的第一枚硬币。使用
len(等高线)
时,它只返回该等高线内的点,即第一枚硬币的点。现在你可以想象你是怎么得到154的。这不是轮廓的数量,而是轮廓内的点的数量。要查看这些点,
打印列表(轮廓)
,当您在图像上绘制这些点时,您可以看到它们都构成了硬币的边界

现在,要选择下一个轮廓或下一枚硬币,请使用
contour=contour.h_next()
,依此类推

我认为没有内置函数来返回轮廓的数量,除非迭代轮廓并计数

尝试此操作并检查是否打印4个cvSeq对象:

while contours:
    print contours
    contours = contours.h_next()
我在这里解释了所有这些事情:

相反,我建议您使用新的
cv2
接口,它更简单、更好。在那里,等高线作为Numpy数组列表返回,您可以使用len(等高线)查找等高线的数量

您可以在此处找到cv和cv2之间差异的简要说明:


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

谢谢,这很有效。我正在学习python和opencv,但我肯定会开始使用cv2,所以我的下一个任务是将当前程序更改为cv2。你会发现它更有趣。访问:www. opcvvython .BogSPo.com,用于一些入门教程。如果它解决了这个问题,你可以通过点击答案旁边的刻度标记来结束这个会话并关闭这个会话。C++显然不是C,而是C++代码。不同的语言。OpenCV不再支持C语言。