Я обнаруживаю прямые линии на изображении с помощью OpenCv. Ниже приведен код:
import cv2
import numpy as np
img = cv2.imread('Image.jpg')
img = img[:, 10:img.shape[1]-10]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
minLineLength = img.shape[1] - 300
lines = cv2.HoughLinesP(image=edges, rho=0.02, theta=np.pi / 500, threshold=10, lines=np.array([]), minLineLength=minLineLength, maxLineGap=2)
a, b, c = lines.shape
for i in range(a):
cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 2, cv2.LINE_AA)
cv2.imwrite('result.png', img)
Для изображения (Снимок экрана PDF) Image.jpg(Ниже) я получаю result.png( Ниже), и это именно тот результат, который мне нужен.
Но когда я даю приведенное ниже изображение Test.jpg в качестве входных данных, мой алгоритм работает неправильно. Выдает следующую ошибку:
a, b, c = lines.shape # 10th Line
AttributeError: 'NoneType' object has no attribute 'shape'
Я думаю, потому что в Test.jpg горизонтальные линии не такие прямые (потому что я нажал на это камерой телефона), а также если я изменю minLineLength значение, скажем, 100, оно не показывает вышеуказанную ошибку, но показывает неполные блеклые линии в каждой строке . Так может ли кто-нибудь сказать мне, какие параметры я должен изменить в своем алгоритме, чтобы он работал правильно?
lines
равноNone
. Я нахожу это очень странным: увеличение порога должно уменьшить количество строк, а не позволить найти их там, где меньшее значение не дало ни одной. Проверьте это значениеlines
и перепроверьте аргументы, которые вы даете этому вызову. - person Prune   schedule 17.04.2018