使用霍夫变换检测车道线
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
第一部分:高斯模糊+ Canny边缘检测
第二部分:霍夫变换
第三部分:优化+显示线条
import numpy as np
import cv2
import matplotlib.pyplot as plt
第1行:Numpy用于执行数学计算,我们要用它来创建和操作数组。
第3行:使用Matplotlib可视化图像。
image_path = r"D:\users\new owner\Desktop\TKS\Article Lane
Detection\udacity\solidWhiteCurve.jpg"
image1 = cv2.imread(image_path)
plt.imshow(image1)
def grey(image):
return cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
def gauss(image):
return cv2.GaussianBlur(image, (5, 5), 0)
def canny(image):
edges = cv2.Canny(image,50,150)
return edges
img参数定义了我们要进行归一化(减少噪声)的图像。这个函数使用一个称为高斯核的核函数,用于对图像进行归一化。
sigma参数定义沿x轴的标准偏差。标准偏差衡量图像中像素的分布,我们希望像素扩散是一致的,因此标准偏差为0。
img参数定义了我们要检测边缘的图像。
threshold-1参数过滤所有低于这个数字的梯度(它们不被认为是边缘)。
threshold-2参数决定了边缘的有效值。
如果两个阈值之间的任何梯度连接到另一个高于阈值2的梯度,则将考虑该梯度。
def region(image):
height, width = image.shape
triangle = np.array([
[(100, height), (475, 325), (width, height)]
])
mask = np.zeros_like(image)
mask = cv2.fillPoly(mask, triangle, 255)
mask = cv2.bitwise_and(image, mask)
return mask
左:Img1,右图:Img2。(实际上,它是白色的,但我们把它改成了黄色)
其他一切都被忽略了,仅输出隔离区域中的边。
lines = cv2.HoughLinesP(isolated, rho=2, theta=np.pi/180,
threshold=100, np.array([]), minLineLength=40, maxLineGap=5)
参数1:孤立梯度
参数5:占位符数组
参数6:最小行长
参数7:最大行间距
笛卡尔坐标空间中的直线
笛卡尔平面上的点在霍夫空间中变成直线
笛卡尔平面上的直线在霍夫空间上变成点
每个点代表前面显示的线(匹配颜色)
笛卡尔平面上的直线在霍夫空间中表示为点
笛卡儿平面上的点在霍夫空间中表示为直线
通过求霍夫空间中与这两个点对应的两条直线的POI的m和b坐标,可以找到笛卡尔空间中两点的最佳拟合直线,然后根据这些m和b的值组成一条直线。
P表示从原点垂直于直线的距离。
θ表示从正x轴到直线的俯角。
xcosθ表示x方向上的距离。
ysinθ表示y方向上的距离。
这是对极坐标含义的直观解释
θ是一条垂直线的90度,因为它从正x轴到直线本身的俯角是90度。θ的另一种表示方法是π/2(弧度)。如果你们想了解更多关于弧度的知识,以及我们为什么要使用它们,这里有一个很好的视频。然而,没有必要知道弧度是什么。
X和Y取点(6,4)的值因为这是我们在这个例子中使用的点。
P = 6cos(90) + 4sin(90)
P = 6(1) + 4(0)
P = 6
我们想解释的东西的图像。
好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~