Как найти каждое ребро и строки с помощью HoughLinesP() в OpenCV и Python?

#python #python-3.x #opencv #edge-detection #houghlinesp

#python #python-3.x #opencv #обнаружение ребер #houghlinesp

Вопрос:

Итак, я пытался обнаружить ребра с помощью HoughLinesP(), но вместо получения точных линий и их конечных точек мой вывод немного отличается от того, что мне нужно.

 image = cv2.imread('C:\Users\Jimit\Desktop\Project\Original Images\Original Capture.jpg')


#Hough Line Detection. 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray, 100, 150)
minLineLength = 200
maxLineGap = 100

lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, minLineLength, maxLineGap)
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
    print(line)

for theta in lines:
    a = np.cos(theta)
    b = np.sin(theta)
    print(a)
    print(b)

cv2.imshow('ab', image)
cv2.waitKey(0)
  

Исходное изображение
Вывод изображения
Конечные точки в оболочке.

Как вы можете видеть из изображений и выходных данных оболочки, я не могу получить точные строки. Более того, мой код, похоже, не справляется с захватом вертикальных линий.

Комментарии:

1. Canny Метод возвращает линии шириной в один пиксель, которые в вашем случае не совсем прямые, поэтому HoughLinesP возникают проблемы с поиском правильных «линий» на вашем изображении. Расширение Canny результата должно сработать, например, добавление edges = cv2.dilate(edges, cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))) после вашей Canny операции. Также установите minLineLength = 50 и maxLineGap = 10 , чтобы найти вертикальные «линии». Это сработало для меня и данного примера.

2. @HanHirse Я сделал то, что вы предложили, но результатом должно быть 4 списка с 4 кортежами в точности. Я получаю около 10 списков , что в основном означает, что над одним ребром есть несколько строк.

3. Вы не получите идеального результата, подобного этому, поскольку форма на изображении искажена, а не является идеальным прямоугольником. Либо сделайте что-то другое, чем HoughLinesP (вам явно нужны линии или достаточно контура?), Либо выполните некоторое ручное объединение отрезков.

4. @HansHirse На самом деле я использую HoughLinesP() для поиска 4 тет , чтобы я мог повернуть его, а затем найти углы, используя HarrisCorner для моего проекта. Есть другие предложения?

5. Если вас действительно интересуют только углы, почему бы не использовать cornerHarris непосредственно на вашем изображении в оттенках серого? Я последовал этому руководству и получил четыре угла «из коробки».