最近开始接触车道线相关的工作,由于本人之前在这一块没有什么经验,所以找了一个基础版本用python做了一下实现,现在把简单的流程进行一下梳理,分享给大家!
笔者是开始做车道线之后才真正把OpenCV用起来,这里从OpenCV的安装开始讲起:
pip install opencv-python
对于图片的操作,OpenCV有很多现成的函数可以用,非常方便,这也为我们的快速实现提供了条件。
这里把图片的读取,展示和保存的代码列在这里:
import cv2
img = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
cv2.show('image', img)
cv2.waitKey(1000)
上面的参数1000为弹出框等待1000ms之后推出,如果要一直等待,可以改为0;如果要以其他速度播放图片流,则可以通过修改这个参数实现,比如:10即为10ms,也就是100fps的速度播放。cv2.imwrite('img_gray.jpg', img)
注意:上面要保存的文件名后缀要是图片格式的扩展名,jpg为压缩格式,bmp为位图格式。edge_img = cv2.Canny(img, 50, 100)
这一部分,是在原有图片的基础上,设置一部分感兴趣区域。做这部分操作,一方面是为了滤除车道线之外的噪点区域,一方面为了降低计算量。
先用OpenCV的fillPoly函数给定一个区域(该函数给定四个角点,即可以将该区域用1覆盖)
import numpy as np
mask = np.zeros_like(edge_img)
mask = cv2.fillPoly(mask, np.array([[[0, 368], [240, 210], [300, 210], [640, 368]]]), color=255)
masked_edge_img = cv2.bitwise_and(edge_img, mask)
lines = cv2.HoughLinesP(edge_imgm, 1, np.pi/180, 15, minLineLength=40, maxLineGap=20)
经过霍夫变换处理得到的直线有很多,一条粗线可能变换成多条线。
这一步就是根据斜率,剔除与均值距离较大的线。
这里用到了几个函数,先列在这里,后面再慢慢详细介绍:
np.ravel // 将高维数组拉成一维
np.polyfit // 多项式拟合
np.polyval // 多项式求值
举个例子
poly = np.polyfit([0,3,6,9], [0,5,9,14], deg=1)
cv2.line(img, (10,10), (200,100), 255, 3)
left_line = least_squares_fit(left_lines)
right_line = least_squares_fit(right_lines)
img = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
cv2.line(img, tuple(left_line[0]), tuple(left_line[1]), color=(0,255,255), thickness=5)
cv2.line(img, tuple(right_line [0]), tuple(right_line [1]), color=(0,255,255), thickness=5)
capture = cv2.VideoCapture('video.mp4')
// 也可以读取摄像头
// capture = cv2.VideoCapture(0)
while True:
ret, frame = capture.read()
frame = show_lane(frame)
cv2.imshow('frame', frame)
cv2.waitKey(10)
以上是一个简单的车道线入门级知识梳理,很多内容还有待细化,我会持续学习以上相关知识,不断细化内容。