opencv+python智能车道检测助力无人驾驶_车道_线段
准确可靠的车道检测是车道保持(LK)、变道自动化(LCA)和车道偏离警告(LDW)功能的关键特性。车道检测的研究可以追溯到20世纪80年代。世纪之交后,LDW和LK已经商业化,有些车辆乃至有LCA。DARPA和早期ADAS产品发起的自动驾驶寻衅进一步推动了车道检测系统的发展。然而,由于不利的光照/景象条件和其他物体的存在,车道检测仍旧是一个具有寻衅性的问题。
车道检测可通过利用单目摄像机、立体摄像机、激光雷达等实现[4]。相机因其丰富的内容功能和低廉的价格而最受欢迎。
深度学习(DL)提出了一种新的数据驱动方法,并且频年夜多数基于特色的方法得到了更好的性能。虽然DL系统在许多运用中取得了精良的性能,但它们常常被用作"黑匣子",其性能没有担保。这限定了它们在安全关键任务中的运用,例如自动驾驶的车道检测。
我们也可以从静态的路标和路标中推断出路标和路标。基于特色的方法,如ELAS,常日在实行车道检测/跟踪任务之前预先检测所有可能的场景线索。对付基于卷积神经网络(CNN)的方法,这种场景信息在网络构造中是隐蔽/隐含的。如果能先理解场景布局,将全体图像分割成几何区域,再聚焦于车道标识区域,则分类精度有望提高。
另一个主要的决定是CNN该当天生什么样的车道标签。许多现有的基于CNN的方法天生像素级的车道标记标志、车道区域掩码或参数化车道线。
对付大多数基于CNN的车道检测方法,输出是图像视图中像素级的车道实例掩码。然而,自主驾驶的期望输出是掌握干系参数,即车辆横向偏移、航向角和曲率。为了补充这一空缺,须要一些后处理程序,例如,反透视图(IPM)和车道模型拟合。由于车辆是运动的,道路并不总是平坦的,光是摄像机的内参数和外参数不敷以打算摄像机与天下坐标之间的变换矩阵。须要更好的车道模型或附加程序,如消逝点估计。
OpenCV+python实现的车道检测深度学习加速了车道检测的精度,本文先先容一下基于OpenCV的车道检测事理,当然精度虽然没有深度学习的高,但详细思想还是有类似的地方
import cv2import numpy as npdef canny(frame): gray = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY) blur = cv2.GaussianBlur(gray,(5,5),0) canny = cv2.Canny(blur,50,150) return canny
首先,我们建立几个子函数,canny子函数用来吸收一个须要检测的照片,并利用高斯滤波函数对图像进行处理
高斯滤波是一种线性平滑滤波,适用于肃清高斯噪声,广泛运用于图像处理的减噪过程。
cv2.GussianBlur()函数
语法:GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> ds
t——src输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
——dst输出图像的大小和类型与src相同。
——ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,也可以为零,然后根据sigma打算得出。
——sigmaX X方向上的高斯核标准偏差。
——sigmaY Y方向上的高斯核标准差;
如果sigmaY为零,则将其设置为即是sigmaX;
如果两个sigmas为零,则分别从ksize.width和ksize.height打算得出;
为了完备掌握结果,而不管将来可能对所有这些语义进行的修正,建议指定所有ksize,sigmaX和sigmaY。
然后利用cv2.Canny函数进行边缘检测
edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
参数阐明
· image:源图像
· threshold1:阈值1
· threshold2:阈值2
· apertureSize:可选参数,Sobel算子的大小
个中,较大的阈值2用于检测图像中明显的边缘,但一样平常情形下检测的效果不会那么完美,边缘检测出来是断断续续的。以是这时候用较小的第一个阈值用于将这些间断的边缘连接起来。
函数返回的是二值图,包含检测出的边缘,末了子函数返回边缘检测的2值化图片
代码截图
def region_of_in(frame): height = frame.shape[0] polygons = np.array([[(0,height),(500,0),(800,0),(1300,550),(1100,height)]]) mask = np.zeros_like(frame) cv2.fillPoly(mask,polygons,255) masked = cv2.bitwise_and(frame,mask) return masked
此子涵紧张用于处理边缘检测后的图片,以便获取mask,只保留车道线
代码截图
def display_line(frame,lines): line_image = np.zeros_like(frame) if lines is not None: for line in lines: x1,y1,x2,y2 = line.reshape(4) cv2.line(line_image,(x1,y1),(x2,y2),(0,255,0),1) return line_image
此子函数紧张用于检测车道线,并显示
代码截图
img = cv2.imread('7.jpg')image = np.copy(img)canny = canny(image)cropped = region_of_in(canny)lines = cv2.HoughLinesP(cropped,1,np.pi/180,100,minLineLength = 5, maxLineGap=300)line_image = display_line(image,lines)frame = cv2.addWeighted(image,0.8,line_image,1,1)cv2.imshow('canny',frame)cv2.waitKey(0)
我们利用3个子函数对一张照片进行车道检测,首先我们读取一张照片,利用canny子函数进行图片边缘车道检测,然后利用region_of_in子函数进行mask的检测
cv2.HoughLinesP()函数可以查找直线段,我们把边缘检测的图片给到cv2.HoughLinesP()检测图片中的直线,然后利用display子函数显示检测到的直线
cv2.HoughLinesP()函数原型:HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)· image: 必须是二值图像,推举利用canny边缘检测的结果图像;· rho: 线段以像素为单位的间隔精度,double类型的,推举用1.0· theta: 线段以弧度为单位的角度精度,推举用numpy.pi/180· threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情形推举先用100试试· lines:这个参数的意义未知,创造不同的lines对结果没影响,但是不要忽略了它的存在· minLineLength:线段以像素为单位的最小长度,根据运用处景设置· maxLineGap:同一方向上两条线段剖断为一条线段的最大许可间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,许可线段上的断裂越大,越有可能检出潜在的直线段
代码截图
末了,我们利用图像稠浊加权实现图片的领悟,紧张函数为cv2.addWeighted函数
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
参数解释· src1– first input array.· alpha– weight of the first array elements.· src2– second input array of thesame size and channelnumber assrc1.· beta– weight of the second array elements.· dst– output array that has thesame size and number of channelsas the input arrays.· gamma– scalar added to each sum.· dtype– optional depth of the output array; when both input arrays have the same depth, dtypecan be set to-1, which will be equivalent tosrc1.depth().
此函数可以用一下矩阵表达式来代替:
dst = src1 alpha + src2 beta + gamma;
由参数解释可以看出,被叠加的两幅图像必须是尺寸相同、类型相同的;并且,当输出图像array的深度为CV_32S时,这个函数就不适用了
以上检测方法,只能检测直线的车道线,当检测圆弧过渡的车道线,就不是那么适宜了,利用此方法只能大略的对车道检测,有时其检测结果也会涌现不尽人意的时候
车道检测
本文系作者个人观点,不代表本站立场,转载请注明出处!