霍夫直线变化

一、cv.HoughLines (不常用)
def line_detection(image):
'''
霍夫直线检测:
1、边缘检测
2、找出每一个可以可疑直线的点
'''
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
edge = cv.Canny(gray, 50, 150, apertureSize=3)
'''
cv.HoughLines(不常用):画出两点之间的一条直线,非线段
rho:半径步长
theta:角度,每次偏转一度
threshold:自定义低阈值
'''
lines = cv.HoughLines(edge, rho=1, theta=np.pi/180, threshold=200)
for line in lines:
print("type(line):")
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0+1000*(-b)) # 不知为何要 ×1000,只有知道源码才行
y1 = int(x0+1000*(a))
x2 = int(x0-1000*(-b))
y2 = int(y0-1000*(a))
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv.imshow("image-lines", image)

二、cv.HoughLinesP(常用)
def line_detect_possible_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
edge = cv.Canny(gray, 50, 150, apertureSize=3)
'''
cv.HoughLinesP(常用):返回准确位置的起始点和终止点,一个一个细小的线段,
则可以根据线段进行测距
rho:半径步长
theta:角度,每次偏转一度
threshold:自定义低阈值
minLineLength:最小线的长度为50个像素,小于50就不算是一个线段。
maxLineGap = 10:同一直线上两个线段的间隙距离小于10的话,就把两个线段连接起来,当做一条线段
'''
lines = cv.HoughLinesP(edge, rho=1, theta=np.pi/180,
threshold=100, minLineLength=50, maxLineGap=10)
for line in lines:
print(type(line))
x1,y1,x2,y2= line[0]
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv.imshow("line_detect_possible_demo", image)


从中可想而知,cv.HoughLines没有minLineLength的情况下,就会乱七八糟,而且不是线段,全是直线。
网友评论