Почему нельзя рисовать линии после обнаружения Canny Edge?

На самом деле я новичок в работе с компьютерным зрением. Извините заранее.

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

Функция cropped_Image просто обрезает многоугольную область текущего кадра.

Функция display_lines рисует линии с абсолютным значением угла от 30 до 90. Для рисования линий используется cv2.line.

Вот код:

_,frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)  # convert image to gray to be one layer
blur = cv2.GaussianBlur(gray, (1, 1), 0)  # to reduce noise in gray scale image
canny = cv2.Canny(blur, 150, 200, apertureSize=3)
cropped_image = region_of_interest(canny) # simply, it crops bottom  of image 
lines = cv2.HoughLinesP(cropped_image, 1, np.pi / 180, 100, np.array([]), 
minLineLength=5, maxLineGap=5)

hough_bundler = HoughBundler()
lines_merged = hough_bundler.process_lines(lines, cropped_image)
line_image = display_lines(frame, lines_merged)
combo_image = cv2.addWeighted(frame, 0.8, line_image, 1, 1)
cv2.imshow(‘test’, combo_image)

Чтобы увидеть это: HoughBundler

Ожидается: ожидаемый img

Canny: canny img неправильного результата

Результат: неверный результат


person Metomania    schedule 16.05.2020    source источник
comment
Красная линия на фото результата означает, что угол линии меньше 30.   -  person Metomania    schedule 16.05.2020


Ответы (1)


Прежде всего, я бы начал с исправления строки cv2.GuassianBlur (). Вы использовали ядро ​​1x1, которое ничего не делает, вам нужно использовать как минимум ядро ​​3x3. Посмотрите, как применяются свертки, если вы хотите знать, почему фильтр 1x1 не работает. Во-вторых, я бы поиграл с размером диафрагмы Кэнни, чтобы он соответствовал моим потребностям. Также после обнаружения краев вы можете использовать cv2.erode () с ядром 3x3 или 5x5, чтобы на изображении не было ломаной линии.

person Muhammad Taha Suhail    schedule 16.05.2020