【问题标题】:Drawing Bounding box around given size Area contour围绕给定大小绘制边界框区域轮廓
【发布时间】:2014-06-17 09:55:30
【问题描述】:

我想在大于某个阈值的区域的每个闭合轮廓周围绘制一个边界框,而不仅仅是最大的轮廓。我该怎么做呢? 到目前为止,这是我尝试过的:

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()      

【问题讨论】:

  • 我尝试修复您的代码格式,但如果代码的含义发生变化,请随时再次编辑,因为空格在 Python 中很重要。
  • 您能否描述一下您遇到的问题?与您的预期相比,当前的行为是什么?我刚刚尝试了您的代码(后期编辑),它围绕多个轮廓绘制轮廓。
  • 嗨 Aurelius,感谢您的编辑,它现在确实有效,缩进是问题所在。如果您想投票,请改写为答案,然后再投票。谢谢
  • 我已经回滚了我上次的编辑,因为它从根本上改变了您的代码的性质。请参阅我的答案以获取工作版本。

标签: python opencv numpy


【解决方案1】:

请记住,缩进级别在 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()

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 2016-11-20
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多