【问题标题】:Unable to display bounding rectangles around contours in OpenCV (Python)无法在 OpenCV(Python)中显示轮廓周围的边界矩形
【发布时间】:2017-05-23 09:49:59
【问题描述】:

我已经编写了这段代码来在图像中绘制的轮廓周围绘制矩形框,但是在运行时,除了我根本看不到的框之外,我得到了所有正确的东西。什么错误?

for cnt,heir in zip(contours, hierarchy):
    (x,y,w,h) = cv2.boundingRect(cnt);
    cv2.rectangle(im2,(x,y),(x+w,y+h),(0,255,0),2)

cv2.drawContours(im2, contours, -1, (255,255,255), 2);   
cv2.imshow("Contours",im2);

PS。我使用 OpenCV 3.1.0 和 Python 2.7

编辑:我尝试遍历每个轮廓,为了检查它,我修改了代码如下:

for cnt,heir in zip(contours, hierarchy):
    print ('Contour Area:',cv2.contourArea(cnt));
    (x,y,w,h) = cv2.boundingRect(cnt);
    print (x,y,h,w)
    cv2.putText(im2,'worm',(x+w,y+h), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2, cv2.LINE_AA);
    cv2.rectangle(im2,(x,y),(x+w,y+h),(255,0,0),2);

我打印了每个轮廓的区域,每个轮廓的 (x,y,w,h) 值,并为每个轮廓放置文本“蠕虫”,并在每个轮廓周围绘制矩形框。但是我只得到 1 个输出:

对于像这样的图像:

我需要在每个类似蠕虫的生物上显示文本“蠕虫”。但是我只得到它一次。有什么问题?

【问题讨论】:

  • 使用print()查看变量中的内容(即print(contours))以及执行了哪部分代码(即print("I'm inside for-loop"))。也许 OpenCV 返回带有 contours 的空列表 BTW:OpenCV if can't do something 不会引发错误但返回 None 并且您不知道有问题。
  • stackoverflow.com/questions/22137511/… - 他们使用不同的颜色,因为(0,255,0) 在他们的图像上是不可见的。
  • @furas 这就是我得到的:i.imgur.com/dSS3YRy.png - 包含一些数字的非常大的嵌套数组列表。另外,我换了颜色,不行!
  • 你检查过(x,y,w,h) 中的内容吗?也许你有w=0, h=0
  • 你能上传你正在使用的图片吗?你想检测什么?

标签: python opencv image-processing bounding-box opencv-contour


【解决方案1】:

我曾经使用下面的代码在检测到的轮廓上绘制矩形。希望对您有所帮助。

for contour in contours:
    # get rectangle bounding contour
    [x,y,w,h] = cv2.boundingRect(contour)

    # draw rectangle around contour on original image
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,255),2)

【讨论】:

  • 巧合的是,我刚刚尝试删除层次结构部分 - 它确实有效!谢谢你的帮助:)
【解决方案2】:

简单写:

for c in contours:
    (x,y,w,h) = cv2.boundingRect(c);
    cv2.putText(im2,'worm',(x+w,y+h), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 2, cv2.LINE_AA);
    cv2.rectangle(im2,(x,y),(x+w,y+h),(255,0,0),2);

cv2.drawContours(im2, contours, -1, (255,255,255), 2);   
cv2.imshow("Contours",im2);

正如 furas 所建议的,如果层次结构只有一个,则 zip(contours,hierarchy) 将只返回一对。在这种情况下,contours 列表上的简单循环可以工作。

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 2018-03-13
    • 2018-02-13
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多