直线检测原理
霍夫变换是图像处理必然接触到的一个算法,它通过一种投票算法检测具有特定形状的物体,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果,该方法可以进行圆,直线,椭圆等形状的检测。在车道线检测中,当初考虑的一个方案便是采用霍夫变换检测直线进行车道线提取。
x,y坐标系中直线上的一个点对应到ρ,θ坐标系中是一条曲线。
x,y坐标系中直线上的所有点在ρ,θ坐标系中对应的所有曲线交汇到一个点上。
ρ,θ坐标系中的一个点对应x,y坐标系中的一条直线。
使用opencv进行直线检测
在使用霍夫变换侦测直线前,须先利用边缘检测算法来减少图像的数据量、剔掉不相关的信息,保留图像中重要的结构特征。
2.1 图像灰度化
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
原始图像与灰度化的图像如下:
2.2 边缘检测
利用边缘检测算法(Canny、Sobel、Laplacian等)来检测物体边缘,代码如下:
canny = cv2.Canny(gray_img, 30, 150)
2.3 霍夫变换
使用霍夫变换来得出直线检测结果,代码如下:
# 使用HoughLinesP检测线段
lines = cv2.HoughLinesP(canny, 1, np.pi / 180, 180, minLineLength=100, maxLineGap=10)# 检查是否检测到线段
if lines is not None:for line in lines:x1, y1, x2, y2 = line[0]cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imshow('original', img)
2.4 完整代码
import cv2
import numpy as npimg = cv2.imread("Resources/img_1.png")cv2.imshow("Output",img)
cv2.waitKey(0)gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray_img)
cv2.waitKey(0)canny = cv2.Canny(gray_img, 30, 150)
cv2.imshow('canny', canny)
cv2.waitKey(0)# 使用HoughLinesP检测线段
lines = cv2.HoughLinesP(canny, 1, np.pi / 180, 180, minLineLength=100, maxLineGap=10)# 检查是否检测到线段
if lines is not None:for line in lines:x1, y1, x2, y2 = line[0]cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imshow('original', img)cv2.waitKey(0)