最大の輪郭だけでなく、あるしきい値よりも大きい領域のそれぞれの閉じた輪郭の周りに境界ボックスを描画したいです。どうすればいいでしょうか? これまで試したことは次のとおりです。
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()
ベストアンサー1
Python ではインデント レベルが重要であることを覚えておいてください。また、コードは必ずしも最大の輪郭の周りにボックスを描画するわけではなく、 の最後の要素の周りにボックスを描画することに注意してくださいcontours
。幸い、修正は簡単です。 と の呼び出しをインデントするだけでcv2.rectangle()
、ループの繰り返しごとに評価されます。に展開することでcv2.putText()
の呼び出しを削除することもできます。コードは次のようになります。cv2.boundingRect()
rect
x,y,w,h
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()