Обнаружение и выделение линий на изображении - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь написать кусок кода, который может обнаруживать и изолировать прямые линии от изображения. Для этого я использую библиотеку opencv, а также обнаружение краев Канни и преобразование Хафа. До сих пор я придумал следующее:

import numpy as np
import cv2

# Reading the image
img = cv2.imread('sudoku-original.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Edge detection
edges = cv2.Canny(gray,50,150,apertureSize = 3)
# Line detection
lines = cv2.HoughLines(edges,1,np.pi/180,200)

for rho,theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))

    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)

cv2.imwrite('linesDetected.jpg',img)

Теоретически этот фрагмент кода должен выполнять свою работу, но, к сожалению, это не так. Результирующая картинка ясно показывает только одну найденную строку. Я не совсем уверен, что я делаю здесь неправильно и почему он обнаруживает только одну конкретную строку. Может ли кто-нибудь выяснить проблему здесь?

enter image description here

1 Ответ

2 голосов
/ 27 мая 2019

Несмотря на то, что в Hough Transform учебнике opencv используется только один цикл, форма lines является действительной [Нет, 1,2], поэтому при использовании lines[0] вы получите только один элемент для rho и один предмет для theta, который даст вам только одну строчку. поэтому, я предлагаю использовать двойной цикл (ниже) или некоторую магию с кусочками, чтобы поддерживать только 1 цикл. Чтобы обнаружить всю сетку, как упоминалось Dan Masek, вам нужно поиграть с логикой обнаружения ребер. Может быть, посмотрите решение , которое использует HoughLinesP.

for item in lines:
    for rho,theta in item:
        ...

enter image description here

...