文章目录
前言一、虚实线的检测二、黄白线的检测
前言
针对传统图像处理方法的车道线检测,提出黄白、虚实车道线的区别。之前的算法流程及代码参考:https://blog.csdn.net/m0_46988935/article/details/109234900
一、虚实线的检测
车道线的线形主要有虚线和实线,但大多数车道线检测算法对这两者并不进行区分。然而在对道路环境进行感知中,虚线和实线的区分具有非常重要的作用,区分两者有利于车辆进一步推断自身所在环境,比如在车道保持算法中对虚线和实线的偏离预警应有不同的策略。而我在车道线的检测过程中基于虚线与实线的几何特征对这二者进行了区分。因为使用霍夫变换算法检测到的车道线返回的值是车道线的起点与终点的坐标,根据实际情况可知实线的长度要大于虚线的长度,因而推断出可计算检测到的车道线的长度对实线与虚线进行区分。但是为了减少计算量,我选择了计算检测到的车道线的起点与终点坐标在 y 方向上的差值以替换长度值来实现区分。假设在一帧中检测到的某条车道线的起点和终点坐标分别为 (x1,y1) 和 (x2,y2),经过这两个坐标的直线的斜率为 slope,具体算法过程如下:
根据直线斜率 slope 的正负判断检测的车道为左车道还是右车道。对于左右 2 条车道,分别计算y1 与 y2 差值的绝对值,并将该长度与阈值 Threshold(我给定的是60)进行比较,若大于该阈值,则判定为实线;否则为虚线。
具体代码如下:
def solid_dotted_judge(frame, lines):
if len(lines) > 0:
for line in lines:
slope, x1, y1, x2, y2 = line
k = abs(y2 - y1)
font = cv.FONT_HERSHEY_SIMPLEX
# 右车道线
if slope >0:
if k >= 60:
cv.putText(frame, 'Right Solid', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
else:
cv.putText(frame, 'Right Dotted', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
# 左车道线
else:
if k >= 60:
cv.putText(frame, 'Left Solid', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
else:
cv.putText(frame, 'Left Dotted', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
二、黄白线的检测
首先我们需要了解HSV颜色空间个颜色参数值, 从上表可以得知,将颜色空间从 RGB 转成 HSV 后,白色的 S (饱和度)参数值介于 [0,30] 之间,而黄色的 S 参数介于 [43,255] 之间,两者存在着清晰的界限,在假定只有黄白车道线的前提下,只要判定某一像素点的 S 参数值大于 40,那么就可以认为该点为黄点。进而,在检测出的车道线上取若干(以 11 为例)个点分别判断 S 值,如果黄点的个数超过阈值(以 4 为例),则判定该线为黄线,否则判断为白线。
def color_judge(frame, frame1, lines):
frame2 = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
L = []
if len(lines) > 0:
for i in range(len(lines)):
L.append(lines[i])
for line in L:
# print(line)
slope, x1, y1, x2, y2= line
p = 0
for i in range(1, 11):
y = int(y1 + (y2 - y1) * i / 11)
x = int(x1 + (x2 - x1) * i / 11)
# print(x, y)
h, s, v = frame2[y][x]
if s > 40:
p += 1
if p >= 3:
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(frame1, 'Yellow', (int((x1 + x2) / 2), int((y1 + y2) / 2)), font, 0.5, (0, 255, 255), 2)
else:
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(frame1, 'White', (int((x1 + x2) / 2), int((y1 + y2) / 2)), font, 0.5, (255, 255, 255), 2)
|