https://docs.opencv.org/3.4.3/dd/d1a/group__imgproc__feature.html#ga8618180a5948286384e3b7ca02f6feeb
lines = cv.HoughLinesP( image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]] )
在二值化图片里检测直线
参数 | 描述 |
---|---|
img | 输入图像 |
lines | 输出直线的坐标 |
rho | 像素每次迭代的大小(每一次选取像素的过程跳跃多少,一般设置为1) |
theta | 角度累加器的大小(即直线参数theta,一般为pi/180) |
thresold | 超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试 |
minLineLength | 线段的最小长度 |
maxLineGap | 同一方向上两条线段判定为一条线段的最大允许间隔 |
示例:
import cv2 as cv
import numpy as np
img = cv.imread('./data/test2.png')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 转换为灰度图
cv.imwrite('./data/test_gray.png',gray)
ret,gray = cv.threshold(gray,230,255,cv.THRESH_BINARY_INV) # 进行二值化处理
cv.imwrite('./data/test_bin.png',gray)
# edges = cv.Canny(gray, 50, 150, apertureSize=3) # 边缘检测
# cv.imwrite('./data/test_edges.png',edges)
lines = cv.HoughLinesP(gray, 1, np.pi / 180, 100, minLineLength=1000, maxLineGap=10) # 直线检测
for line in lines:
x1, y1, x2, y2 = line[0]
cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
print(line[0])
cv.imwrite("./data/test_line.png",img)
cv.namedWindow('1', cv.WINDOW_NORMAL)
cv.imshow('1',img)
k = cv.waitKey(0) # 无限等待一个键击,将此键击存在k变量中
if k == 27: # 27代表esc,可以查看ascii码表
cv.destroyAllWindows() # 退出窗口
原图:
灰度化
二值化
直线检测