【智能驾驶】车道线检测中的新IPM(逆透视变换)算法实验效果

1实验内容

在车道保持LKA功能实现时,需要对车道线进行精准检测:①、计算曲率半径,②、保证测距精度。因此需要对相机的透视图persImg进行IPM逆透视变换,得到俯视图birdImg,在birdImg中进行车道线特征检测、拟合和测距。

基于以下思路,建立了新的IPM模型:对真实世界坐标系中欲关注车前的区域(如12m×30m),由相机模型可以确定在透视图中的对应区域。在设定好分辨率的俯视图中,把对应世界坐标系中的点在透视图中对应点的像素赋给俯视图。

原IPM模型是基于加州大学论文《Real time Detection of Lane Markers in Urban Streets》实现的,该算法俯视图效果车道线区域占俯视图比重小,保留干扰多,测距精度低。在更新IPM模型后,会使用实车样本进行新IPM、原IPM模型的对比实验。

2、实验条件

① 生成的俯视图分辨率:240×312;

② 为了尽可能和原IPM模型参数接近,在新IPM模型中取:车前ROI底部为5m,顶部为35m,宽度为12m;

③ 根据params.txt中的参数,最终调整相机姿态角为:

YawPitchRoll[3]={-0.5,  3.522106, 0.683845 };

3、实验结果展示及对比

原IPM模型、新IPM模型生成的俯视图的对比效果如下:

IPM模型                                   IPM模型

     

     

由上面第13、213帧,对比原IPM和新IPM模型生成的俯视图,可以发现:IPM模型从“需求”出发只关注车前划定的区域(自定义宏,可根据实际情况进行修改)。所以生成的俯视图尽可能的包含了实际需要的车道线信息,而且几乎充满俯视图的显示区域内。

IPM模型直接在透视图中画矩形ROI,由于近端和远端在俯视图上的相同像素,代表的实际距离相差数倍,所以生成的俯视图呈“下窄上宽”的倒梯形。因此,保留了很多车道线外的干扰信息,还把真实有用的车道线“拥挤”在俯视图中央区域显示

    

    

对比第915、1060帧中,原、新IPM模型生成的俯视图,可以发现:与原IPM模型相比,IPM模型下俯视图中的车道线更粗,更清晰。而且,远端车道线的信息也更加完整清楚、易于辨识

    

    

    

    

对比上面第1565、1611、3238、5055帧(带前车干扰),可以看出:与原IPM模型相比,IPM模型下前车干扰的长度变短、宽度增大,整体而言畸变减小。故带来的干扰区域更集中、与车道线的夹角更大。在后期的特征提取模块,干扰更易于处理

综上所述,与原IPM模型相比,新IPM模型效果提升显著:1、考虑了相机三个姿态角,俯视图中车道线信息平行等宽效果变好;2、直接定车前欲关注的范围,俯视图中车道线信息更清晰准确,干扰信息大幅减小。

4、实验结论

  验证发现:IPM模型和相机外参模型结果正确通过对比新、原IPM模型下效果发现:与原IPM模型相比,效果提升显著。IPM模型下俯视图中车道线信息更加清晰,无效信息大幅减小。

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
透视变换(Inverse Perspective Mapping,简称IPM)是一种将透视图像转换为俯视图像的技术。在透视变换,远离摄像机的物体会显得更小,而在俯视图像,物体的大小与其在水平面上的实际大小相对应。使用透视变换可以纠正透视畸变,将透视图像转换为具有匀称比例的俯视图像,从而实现更准确的测量和分析。 在Python,你可以使用OpenCV库来实现IPM透视变换。下面是实现透视变换的步骤: 1. 确定透视变换的源图像和目标图像的四个关键点。这些点应该组成一个四边形,表示源图像的一个区域,以及目标图像的相应区域。 2. 使用cv2.getPerspectiveTransform()函数计算透视变换矩阵。该函数需要输入源图像和目标图像的关键点,然后返回透视变换矩阵。 3. 使用cv2.warpPerspective()函数将源图像进行透视变换。该函数需要输入源图像、透视变换矩阵和目标图像的大小,然后返回透视变换后的图像。 下面是一个实例代码,展示了如何使用Python和OpenCV来进行IPM透视变换: ```python import cv2 import numpy as np # 定义源图像和目标图像的关键点 src_points = np.float32([[x1, y1], [x2, y2], [x3, y3], [x4, y4]]) dst_points = np.float32([[x1, y1], [x2, y1], [x2, y2], [x1, y2]]) # 计算透视变换矩阵 M = cv2.getPerspectiveTransform(src_points, dst_points) # 执行透视变换 result = cv2.warpPerspective(image, M, (width, height)) # 显示结果图像 cv2.imshow("Result", result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,上述代码的`x1, y1, x2, y2, x3, y3, x4, y4`是源图像和目标图像的关键点坐标。你需要根据实际情况进行替换。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值