OpenCV Python: обнаружение линий только в ROI

Я хотел бы обнаружить линии внутри интересующей области. Мое выходное изображение должно отображать исходное изображение и обнаруженные линии в выбранной области интереса. До сих пор не было проблемой найти линии на исходном изображении или выбрать область интереса, но поиск линий только внутри области интереса не работал. Мой MWE считывает изображение, преобразует его в оттенки серого и позволяет выбрать область интереса, но выдает ошибку, когда HoughLinesP хочет прочитать roi.

import cv2
import numpy as np

img = cv2.imread('example.jpg',1)
gray = cv2.cvtColor(img ,cv2.COLOR_BGR2GRAY)

# Select ROI
fromCenter = False
roi = cv2.selectROI(gray, fromCenter)

# Crop ROI
roi = img[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])]

# Find lines
minLineLength = 100
maxLineGap = 30
lines = cv2.HoughLinesP(roi,1,np.pi/180,100,minLineLength,maxLineGap)
for x in range(0, len(lines)):
    for x1,y1,x2,y2 in lines[x]:
        cv2.line(img,(x1,y1),(x2,y2),(237,149,100),2)

cv2.imshow('Image',img)
cv2.waitKey(0) & 0xFF

cv2.destroyAllWindows()

Консоль показывает:

строки = cv2.HoughLinesP (roi, 1, np.pi/180 100, minLineLength, maxLineGap)

ошибка: OpenCV (3.4.1) C:\Miniconda3\conda-bld\opencv-suite_1533128839831\work\modules\imgproc\src\hough.cpp:441: ошибка: (-215) image.type() == (( (0) & ((1 ‹‹ 3) - 1)) + (((1)-1) ‹‹ 3)) в функции cv::HoughLinesProbabilistic

Я предполагаю, что roi не имеет правильного формата. Я использую Python 3.6 со Spyder 3.2.8. Спасибо за любую помощь!


person Philipp    schedule 07.11.2018    source источник


Ответы (1)


Функция cv2.HoughLinesP ожидает одноканальное изображение, поэтому обрезанная область может быть взята из серого изображения, и это устранит ошибку:

# Crop the image
roi = list(map(int, roi)) # Convert to int for simplicity
cropped = gray[roi[1]:roi[1]+roi[3], roi[0]:roi[0]+roi[2]]

Обратите внимание, что я меняю выходное имя с roi на cropped, и это потому, что вам все еще понадобится поле roi. Точки x1, x2, y1 и y2 — это позиции пикселей на обрезанном изображении, а не на полном изображении. Чтобы изображения отрисовывались правильно, вы можете просто добавить позицию пикселя в верхнем левом углу из roi. Вот цикл for с соответствующими правками:

# Find lines
minLineLength = 100
maxLineGap = 30
lines = cv2.HoughLinesP(cropped,1,np.pi/180,100,minLineLength,maxLineGap)
for x in range(0, len(lines)):
    for x1,y1,x2,y2 in lines[x]:
        cv2.line(img,(x1+roi[0],y1+roi[1]),(x2+roi[0],y2+roi[1]),(237,149,100),2)
person A Kruger    schedule 08.11.2018
comment
Изменение координат cv2.line имеет смысл, спасибо за это! cropped и gray — это массивы dtype=uint8, отличающиеся только длиной, но cv2.HoughLinesP(gray,...) предоставляет координаты обнаруженных линий, тогда как cv2.HoughLinesP(cropped,...) просто возвращает None. Вы не знаете, где найти мою ошибку? - person Philipp; 08.11.2018
comment
Это просто означает, что на кропе не было найдено ни одной линии. Вы можете добавить if lines is not None: перед циклом for для защиты от этой ошибки. Вы можете попробовать изменить параметры (minLineLength, maxLineGap и т. д.), если считаете, что линии должны были быть обнаружены. Кроме того, в своем посте вы говорите, что хотите запустить HoughLinesP на изображении, но это может помочь запустить его на изображении с хитрым обнаружением краев как показано в этом руководстве - person A Kruger; 08.11.2018
comment
Большое спасибо! Это работает после настройки значения rho внутри HoughLinesP. Он не находит столько строк, сколько мне нужно, но пока на мой вопрос дан ответ. Входное изображение уже является хитрым изображением обнаружения краев. - person Philipp; 08.11.2018