我正在使用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 (在之下),结果正是我想要的输出。
但是当我将下面的Image Test.jpg 作为输入时,我的算法无法正常工作。它出现以下错误:
a, b, c = lines.shape # 10th Line
AttributeError: 'NoneType' object has no attribute 'shape'
我认为因为在 Test.jpg 中水平线不是那么直(因为我通过手机的相机点击了这个)而且如果我改变 minLineLength 值让我们说 100 没有显示上述错误但显示不完整的褪色线在每一行。那么有人可以告诉我,我应该在算法中更改哪些参数以使其正常工作?
答案 0 :(得分:1)
你需要放松对#34;直接"的定义。文档清晰如果您已经熟悉几何术语。 " RHO"和" theta"是极坐标的变量:长度和方向,在这种情况下。由于您担心方向的变化,您需要放松theta值
theta=np.pi / 500
限制性太强(PI / 500弧度,仅超过1/3度)。降低500
数字,直到得到你想要的结果。例如,尝试从90
(1度)开始。
答案 1 :(得分: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)