Hough Line пишет только 1 строку в Python с OpenCV и Numpy - PullRequest
0 голосов
/ 07 октября 2019

Я учусь использовать HoughLines () с Python, OpenCV и numpy. Я использую следующее изображение:

enter image description here

И я пытаюсь обнаружить все линии, а не только самые толстые линии. Вот результат:

enter image description here

А вот мой код:

import cv2
import numpy as np
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to the imput image")
args = vars(ap.parse_args())

img = cv2.imread(args['image'])
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite('edges_found.jpg',edges)
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

for r,theta in lines[0]:
    a = np.cos(theta)
    b=np.sin(theta)
    x0 = a*r
    y0 = b*r
    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)

Я использую учебник / код здесь:https://opencv -python-tutroals.readthedocs.io / en / latest / py_tutorials / py_imgproc / py_houghlines / py_houghlines.html

Это кажется простым, но в учебнике используются изображениясудоку в газете и много строк возвращено, где я получаю одну строку. Как вы можете видеть в коде, я вывел edges на отдельное изображение, чтобы увидеть, что там происходит, и вот результат:

enter image description here

Похоже, что было найдено много краев, но я получаю только одну красную линию, а не много. Где мой код неверен?

1 Ответ

0 голосов
/ 07 октября 2019

Это потому, что вы отображаете только одну строку в вашем коде, на самом деле их больше, чем одна.

for r,theta in lines[0]:
    a = np.cos(theta)
    b=np.sin(theta)
    x0 = a*r
    y0 = b*r
    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)

должно быть

for line in lines:
    for r,theta in line:
        a = np.cos(theta)
        b=np.sin(theta)
        x0 = a*r
        y0 = b*r
        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)
...