在给定尺寸区域轮廓周围绘制边界框

20

我想在面积大于某个阈值的每个封闭轮廓周围绘制一个边界框,而不仅仅是最大的轮廓。我该如何做到这一点?

到目前为止,这是我尝试过的:

contours, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    rect = cv2.boundingRect(c)
    if rect[2] < 100 or rect[3] < 100: continue
    print cv2.contourArea(c)
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(im,'Moth Detected',(x+w+10,y+h),0,0.3,(0,255,0))
cv2.imshow("Show",im)
cv2.waitKey()  
cv2.destroyAllWindows()      

2
我尝试修复了你的代码格式,但如果代码的含义发生了变化,请随意再次编辑,因为在Python中空格很重要。 - Aurelius
1
你能描述一下你遇到的问题吗?当前的行为与你期望的有什么不同?我刚试了一下你的代码(编辑后),它会在多个轮廓周围绘制轮廓。 - Aurelius
嗨,Aurelius,感谢您的编辑,现在它确实可以工作了,缩进是问题所在。如果您想要得到投票支持,请将其重写为答案,我会投票支持的。谢谢。 - Mohamed Elfatih
我已经撤销了我的最后一次编辑,因为它从根本上改变了你的代码的性质。请查看我的答案获取一个可工作的版本。 - Aurelius
1个回答

29

请记住,在Python中缩进的层次结构很重要。值得注意的是,您的代码不一定会在最大轮廓周围绘制一个框,而是会在contours的最后一项周围绘制一个框。幸运的是,修复方法很简单。只需使cv2.rectangle()cv2.putText()的调用缩进,以便它们在每次循环迭代时被评估。您还可以通过将rect扩展为x,y,w,h来消除对cv2.boundingRect()的调用。然后,您的代码将变为:

contours, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    rect = cv2.boundingRect(c)
    if rect[2] < 100 or rect[3] < 100: continue
    print cv2.contourArea(c)
    x,y,w,h = rect
    cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.putText(im,'Moth Detected',(x+w+10,y+h),0,0.3,(0,255,0))
cv2.imshow("Show",im)
cv2.waitKey()  
cv2.destroyAllWindows()

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