无人驾驶项目实战:使用OpenCV进行实时车道检测( 二 )


车道检测的图像预处理我们将首先对输入视频中的所有帧应用蒙版 。然后,我们将应用图像阈值处理,然后进行霍夫线变换来检测车道标记 。
图像阈值处理
在该方法中,我们基于一个阈值,将灰度图像的像素值分配为黑色或者白色 。如果像素的值大于阈值,则为其分配一个值(黑色或白色),否则为另一个颜色 。
如你在上方所见,在对蒙版图像应用阈值设置后,我们在输出的图像中只留下了车道标记 。现在,我们可以借助霍夫线变换轻松地检测到这些标记 。
霍夫线变换
霍夫变换是一种检测可以数学表示的形状的技术 。
例如,它可以检测矩形,圆形,三角形或直线等形状 。而我们关注的对象是可以表示为线的车道标记 。我非常建议你查阅霍夫变换的资料:
https://opencvpythontutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html
在执行图像阈值处理后,在图像上应用霍夫线变换,我们将得到以下的输出图像:

无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
我们需要针对所有帧执行此过程,然后将生成的帧拼接到新视频中 。
在Python中使用OpenCV实现车道检测现在该用Python实现这个车道检测项目了!我建议使用Google Colab,因为构建车道检测系统将需要很大计算力 。
首先,导入所需的库:
import osimport reimport cv2import numpy as npfrom tqdm import tqdm_notebookimport matplotlib.pyplot as plt读取视频帧
我已经从该YouTube视频中采样了一些视频帧 。您可以从此链接下载 。
https://drive.google.com/file/d/1e4cc4zFFna3Owyym6aq7ZXoquHA2l95O/view
# get file names of framescol_frames = os.listdir('frames/')col_frames.sort(key=lambda f: int(re.sub('D', '', f)))# load framescol_images=[]让我们绘制其中一帧:
 # specify frame indexidx = 457# plot frameplt.figure(figsize=(10,10))plt.imshow(col_images[idx][:,:,0], cmap= "gray")
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
创建帧蒙版
我们感兴趣的区域是多边形 。我们要掩盖除此区域以外的所有内容 。因此,我们首先必须指定多边形的坐标,然后使用它来准备蒙版:
# create a zero arraystencil = np.zeros_like(col_images[idx][:,:,0])# specify coordinates of the polygonpolygon = np.array([[50,270], [220,160], [360,160], [480,270]])# fill polygon with onescv2.fillConvexPoly(stencil, polygon, 1)# plot polygonplt.figure(figsize=(10,10))plt.imshow(stencil, cmap= "gray")plt.show()
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
# Apply polygon as a mask on the frameimg = cv2.bitwise_and(col_images[idx][:,:,0], col_images[idx][:,:,0], mask=stencil)# plot masked frameplt.figure(figsize=(10,10))plt.imshow(img, cmap= "gray")plt.show()
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
图像预处理
我们必须对视频帧执行几个图像预处理操作,以检测所需的车道 。预处理操作为:
1. 图像阈值处理
2. 霍夫线变换
1.图像阈值处理
# get file names of framescol_frames = os.listdir('frames/')col_frames.sort(key=lambda f: int(re.sub('D', '', f)))# load framescol_images=[]
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
2. 霍夫线变换
lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)# create a copy of the original framedmy = col_images[idx][:,:,0].copy()# draw Hough linesfor line in lines:x1, y1, x2, y2 = line[0]cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)# plot frameplt.figure(figsize=(10,10))plt.imshow(dmy, cmap= "gray")plt.show()
无人驾驶项目实战:使用OpenCV进行实时车道检测

文章插图
 
现在,我们将所有这些操作应用于每个帧 。我们还将结果帧保存在新目录中:
cnt = 0for img in tqdm_notebook(col_images):# apply frame maskmasked = cv2.bitwise_and(img[:,:,0], img[:,:,0], mask=stencil)# apply image thresholdingret, thresh = cv2.threshold(masked, 130, 145, cv2.THRESH_BINARY)# apply Hough Line Transformationlines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)dmy = img.copy()# Plot detected linestry:for line in lines:x1, y1, x2, y2 = line[0]cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)cv2.imwrite('detected/'+str(cnt)+'.png',dmy)except TypeError:cv2.imwrite('detected/'+str(cnt)+'.png',img)cnt+= 1


推荐阅读