有没有一种方法可以显示我找到的所有边界框?

时间:2019-07-14 19:06:08

标签: python opencv image-processing jupyter-notebook bounding-box

我已经能够获得图像中的所有轮廓,但是无法打印出各个轮廓的所有边界框。

我尝试在for循环中打印每个边界,但这只是将程序挂在中间:

import cv2
img=cv2.imread("C:/Users/user1/example_check.png")

gr=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,th=cv2.threshold(gr,225,255,cv2.THRESH_BINARY)

ca=cv2.Canny(th,225,255)

con,h=cv2.findContours(ca.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

s_con=sorted(con,key=cv2.contourArea,reverse=True)[1:]

for (i,c) in enumerate(s_con):
    dc=cv2.drawContours(img.copy(),s_con,-1,(0,255,0),1)
    cv2.imshow('Contours',dc)

    (x1,y1,w,h)=cv2.boundingRect(c)
    rect=cv2.rectangle(img,(x1,y1),(x1+w,y1+h),(0,255,0),2)

    cv2.imshow("Rectangled",rect) 

    if cv2.waitKey(1)==13:
        break

cv2.waitKey(0)
cv2.destroyAllWindows()

我希望输出显示所有现有的边界框,但是程序在执行时挂起

1 个答案:

答案 0 :(得分:0)

这是因为您在for循环的每次迭代中都在等待按键。它旨在在每个循环中显示一个边界矩形,并等待按键,直到您打开新窗口。

这是导致程序挂起的原因:

    if cv2.waitKey(1)==13:
        break

就前进而言,您可以通过以下两种方法来实现。首先,您可以删除按键并为每个矩形打开一个单独的窗口。或者,您可以将所有矩形绘制到一张图像上。我为以下示例代码选择了此路径:

import cv2
img=cv2.imread("C:/Users/user1/example_check.png")

gr=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,th=cv2.threshold(gr,225,255,cv2.THRESH_BINARY)

ca=cv2.Canny(th,225,255)

con,h=cv2.findContours(ca.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

s_con=sorted(con,key=cv2.contourArea,reverse=True)[1:]

for (i,c) in enumerate(s_con):
    img=cv2.drawContours(img.copy(),s_con,-1,(0,255,0),1)

    (x1,y1,w,h)=cv2.boundingRect(c)
    # instead of creating a new image, I simply modify the old one
    img=cv2.rectangle(img,(x1,y1),(x1+w,y1+h),(0,255,0),2)

# show the modified image with all the rectangles at the end.
cv2.imshow("Rectangled",img) 


cv2.waitKey(0)
cv2.destroyAllWindows()

编辑 轮廓与边界矩形相同。 (dc=img=)。