我已经能够获得图像中的所有轮廓,但是无法打印出各个轮廓的所有边界框。
我尝试在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()
我希望输出显示所有现有的边界框,但是程序在执行时挂起
答案 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=
)。