1

我正在使用 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)作为结果,这正是我想要的输出。

图片.jpg 在此处输入图像描述

结果.png 在此处输入图像描述

但是当我将下面的 Image Test.jpg作为输入时,我的算法无法正常工作。它给出以下错误:

a, b, c = lines.shape # 10th Line
AttributeError: 'NoneType' object has no attribute 'shape'

我认为是因为在Test.jpg中水平线不是那么直(因为我通过手机的摄像头点击了它)而且如果我将minLineLength值更改为假设100不会显示上述错误但显示不完整的褪色线排。那么谁能告诉我我应该在我的算法中更改哪些参数以使其正常工作?

测试.jpg在此处输入图像描述

4

2 回答 2

1

您需要放宽对“直”的定义​​。如果您已经熟悉几何学的术语,那么文档就很清楚了。“rho”和“theta”是极坐标的变量:在这种情况下是长度和方向。由于您担心方向的变化,因此您需要放松 theta 值

theta=np.pi / 500

过于严格(PI/500 弧度,刚好超过 1/3 度)。减少这个500数字,直到你得到你喜欢的结果。例如,尝试从90(1 度)开始。

于 2018-04-16T18:09:56.780 回答
0

可能添加一个条件来测试是否有一条线。请记住,您正在寻找特定长度的线条。第二张图片没有。我试过你的代码并评论

minLineLength = img.shape[1] - 300

您的代码仅适用于特定图像。如果您需要使用任何图像注释掉这些行

#img = img[:, 10:img.shape[1]-10]
minLineLength = 10 #img.shape[1] - 300

如果是这种情况,它会起作用我执行的最终代码是

import cv2
import numpy as np
img = cv2.imread('test.jpg')
#img = img[:, 10:img.shape[1]-10]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
minLineLength = 20 #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)
于 2018-04-17T18:16:02.203 回答