车道线检测之3D车道线检测

《3D-LaneNet: End-to-End 3D Multiple Lane Detection》

可参考文献:https://mp.weixin.qq.com/s/QauztOcpzia6OLCkm8m4wg

坐标系定义

有相机坐标系Ccamera和道路坐标系Croad,作者假定两个坐标系的roll和yaw一致,仅存pitch的差异,那么,两坐标系之间的转换关系Tc2r将由h_cam和camera pitch确定,其中,h_cam和camera pitch由模型预测。

模型IO

输入为相机采集的图像,输出分为2部分,第一部分为h_cam和camera pitch,第二部分为道路坐标系Croad下的车道线,每条车道线由Croad下的K个点表示。

模型结构

输入图像由two parallel steams or path-ways提取特征,分别是image-view pathway和top-view pathway,叫dual-pathway backbone

image-view pathway输出的参数camera pitch和camera height作为构成Tc2r(将图像变为鸟瞰图的变换矩阵),这个操作有projective transformation layer完成。

top-view pathway输出的车道参数。作者采用基于Anchor的思想,输出为一个3*(2k+1)*1*N的矩阵。其中,N表示anchor个数,等于w/8,3表示每个anchor输出3种类型的车道信息,分别有{c1, c2, d}表示,对于每种类型的车道信息,由1个confidence和k个点表示,每个点包含2个信息,用表示。x表示该点在道路坐标系中,相对于anchor的水平偏移,z表示z轴的坐标值,每个点的y坐标事先定义,为一组固定的值

其中,d表示land delimiter, c1表示左边的centerline,c2表示右边的centerline,如下图所示。

训练

对于车道类型,用交叉熵损失函数,对于坐标,用L1损失函数。

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于道路可行驶区域检测是一个比较复杂的问题,涉及到图像处理、点云分割、特征提取等多个方面,因此下面仅提供一个简单的示例代码,供参考: ```cpp #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h> #include <pcl/features/normal_3d.h> #include <pcl/segmentation/region_growing.h> #include <pcl/visualization/cloud_viewer.h> int main() { // 读取点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("test.pcd", *cloud); // 下采样 pcl::VoxelGrid<pcl::PointXYZ> sor; sor.setInputCloud(cloud); sor.setLeafSize(0.1f, 0.1f, 0.1f); sor.filter(*cloud); // 计算法线 pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); tree->setInputCloud(cloud); ne.setInputCloud(cloud); ne.setSearchMethod(tree); ne.setKSearch(20); ne.compute(*normals); // 区域生长分割 pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg; reg.setMinClusterSize(50); reg.setMaxClusterSize(100000); reg.setSearchMethod(tree); reg.setNumberOfNeighbours(30); reg.setInputCloud(cloud); reg.setInputNormals(normals); reg.setSmoothnessThreshold(3.0 / 180.0 * M_PI); reg.setCurvatureThreshold(1.0); std::vector<pcl::PointIndices> clusters; reg.extract(clusters); // 可视化 pcl::visualization::PCLVisualizer viewer("PointCloud Viewer"); viewer.setBackgroundColor(0, 0, 0); viewer.addPointCloud(cloud, "cloud"); for (int i = 0; i < clusters.size(); i++) { pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>); for (int j = 0; j < clusters[i].indices.size(); j++) { cluster->points.push_back(cloud->points[clusters[i].indices[j]]); } pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> color_handler(cluster); viewer.addPointCloud(cluster, color_handler, "cluster_" + std::to_string(i)); } viewer.spin(); return 0; } ``` 上述代码实现了基于区域生长的点云分割,可以将点云分成多个区域。具体思路是先对点云进行下采样,然后计算每个点的法线,最后使用区域生长算法对点云进行分割。最终结果可以在可视化窗口中查看。如果需要得到车道线等更具体的信息,需要在此基础上进一步进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值