По сути, вы можете найти контур объекта независимо от его формы. В вашем случае я нахожу самый большой контур (зеленый), а затем получаю его ограничивающий прямоугольник (красный).
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for i,c in enumerate(contours):
area = cv2.contourArea(c)
#remove small contours and too big contours
if area > 500 and area < 30000:
rect = cv2.boundingRect(c)
cv2.drawContours(img, contours, i ,(0,255,0), 1)
cv2.rectangle(img,(rect[0],rect[1]),(rect[0]+rect[2],rect[1]+rect[3]),(0,0,255),2)
Но я думаю, что в реальных сценариях вы никогда не получите светофор с таким высоким разрешением, как его, поэтому найти их будет сложнее. Я рекомендую использовать некоторые методы предварительной обработки, такие как sobelx, threshold, morphologyEx, ... перед извлечением контуров. Вам также необходимо найти подходящие условия, такие как проверка соотношения, проверка площади, ... чтобы отфильтровать эти контуры, чтобы получить правильный светофор.