Как использовать контуры для обнаружения прямоугольников с 1 неровной стороной? - PullRequest
0 голосов
/ 13 ноября 2018

Это прямоугольник:

image

Причина, по которой я хочу это обнаружить, заключается в том, что я пытаюсь обнаружить блок светофора на изображениях.И когда я смотрю на граничную диаграмму для некоторых изображений, нижний край светофора может быть искажен или неровен, что не позволяет моему алгоритму контура обнаружить прямоугольник.

светофор:

image

1 Ответ

0 голосов
/ 15 ноября 2018

По сути, вы можете найти контур объекта независимо от его формы. В вашем случае я нахожу самый большой контур (зеленый), а затем получаю его ограничивающий прямоугольник (красный).

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)

enter image description here

Но я думаю, что в реальных сценариях вы никогда не получите светофор с таким высоким разрешением, как его, поэтому найти их будет сложнее. Я рекомендую использовать некоторые методы предварительной обработки, такие как sobelx, threshold, morphologyEx, ... перед извлечением контуров. Вам также необходимо найти подходящие условия, такие как проверка соотношения, проверка площади, ... чтобы отфильтровать эти контуры, чтобы получить правильный светофор.

...