OpenCV Python: обнаружение линий только в ROI - PullRequest
0 голосов
/ 07 ноября 2018

Я хотел бы обнаружить линии внутри интересующей области. Мое выходное изображение должно отображать исходное изображение и обнаруженные линии в выбранной области интереса. До сих пор не было проблемой найти линии в исходном изображении или выбрать область интереса, но поиск линий только внутри области интереса не работал. Мой 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()

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

lines = cv2.HoughLinesP (roi, 1, np.pi / 180,100, minLineLength, maxLineGap)

ошибка: OpenCV (3.4.1) C: \ Miniconda3 \ Конда-BLD \ OpenCV-suite_1533128839831 \ работа \ Modules \ imgproc \ SRC \ hough.cpp: 441: ошибка: (-215) image.type () == (((0) & ((1 << 3) - 1)) + (((1) -1) << 3)) в функции cv :: HoughLinesProbabilistic </p>

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

1 Ответ

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

Функция 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)
...