霍夫直线检测原理:
1、对于直角坐标系中的任意一点A(x0,y0),经过点A的直线满足Y0=k*X0+b.(k是斜率,b是截距)
2、那么在X-Y平面过点A(x0,y0)的直线簇可以用Y0=k*X0+b表示,但对于垂直于X轴的直线斜率是无穷大的则无法表示。因此将直角坐标系转换到极坐标系就能解决该特殊情况。
3、在极坐标系中表示直线的方程为ρ=xCosθ+ySinθ(ρ为原点到直线的距离),如图所示:
参考链接:https://blog.csdn.net/ycj9090900/article/details/52944708
https://www.cnblogs.com/ssyfj/p/9275368.html
霍夫直线检测的两种方法
参考链接:https://www.cnblogs.com/ssyfj/p/9275368.html
1.获取灰度图像
2.canny边缘检测
3.获取霍夫直线信息
4.算出直线位置,画出每条直线
代码如下:
# 导入cv模块
import cv2 as cv
import numpy as np
# 直线检测 HoughLines霍夫变换
def line_detection(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize=3) #apertureSize是sobel算子大小,只能为1,3,5,7
lines = cv.HoughLines(edges,1,np.pi/180,200) #函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
for line in lines:
rho,theta = line[0]#获取极值ρ长度和θ角度
a = np.cos(theta)#获取角度cos值
b = np.sin(theta)#获取角度sin值
x0 = a * rho#获取x轴值
y0 = b * rho#获取y轴值x0和y0是直线的中点
x1 = int(x0 + 1000*(-b))#获取这条直线最大值点x1
y1 = int(y0 + 1000*(a)) #获取这条直线最大值点y1
x2 = int(x0 - 1000 * (-b)) #获取这条直线最小值点x2
y2 = int(y0 - 1000 * (a)) #获取这条直线最小值点y2 其中*1000是内部规则
cv.line(image,(x1,y1),(x2,y2),(0,0,255),2)#开始划线
cv.imshow("image line",image)
#直线检测 HoughLinesP概率霍夫变换
def line_detect_possible_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize是sobel算子大小,只能为1,3,5,7
lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50,maxLineGap=10) #函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
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)
print("------------Python Opencv Tutorial!-------------")
# 读取图像,支持 bmp、jpg、png、tiff 等常用格式
src = cv.imread("F:/Projects/images/sudoku.png")
# 创建窗口并显示图像
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src) # 显示原图
line_detection(src)
line_detect_possible_demo(src)
cv.waitKey(0)
# 释放窗口
cv.destroyAllWindows()
运行效果: