激光雷达点云投影到图像

12 篇文章 1 订阅

 

本文旨在记录一些关于激光雷达点云投影到图像的心得。

一、数据准备

1.相机内参(intrinsic matrix),获得方法见ROS功能包camera_calibration标定相机内参_ros camera calibration-CSDN博客

2.激光雷达与相机的外参(extrinsic matrix),获取方法见cam_lidar_calibration

3.同时采集的点云和图像

二、相关代码

1.定义内参矩阵 Camera_inMat

        cv::Mat Camera_inMat = cv::Mat::zeros(3, 3, CV_64F);
        Camera_inMat.at<double>(0, 0) = 1452.65;
        Camera_inMat.at<double>(0, 2) = 969.05;
        Camera_inMat.at<double>(1, 1) = 1453.85;
        Camera_inMat.at<double>(1, 2) = 595.991;
        Camera_inMat.at<double>(2, 2) = 1;

2.定义外参矩阵 transformMatrix_l2c 

        double roll = -1.550963;
        double pitch = 0.013;
        double yaw = -1.560963;
        double tran_x = 0.15;
        double tran_y = -0.10;
        double tran_z = -0.22;

        cv::Mat R_x = (Mat_<double>(3, 3) << 1, 0, 0, 0, cos(roll), -sin(roll), 0, sin(roll), cos(roll));
        cv::Mat R_y = (Mat_<double>(3, 3) << cos(pitch), 0, sin(pitch), 0, 1, 0, -sin(pitch), 0, cos(pitch));
        cv::Mat R_z = (Mat_<double>(3, 3) << cos(yaw), -sin(yaw), 0, sin(yaw), cos(yaw), 0, 0, 0, 1);
        cv::Mat Rotation1 = R_z * R_y * R_x;
        Eigen::Matrix3d RotationMatrix;
        cv::cv2eigen(Rotation1, RotationMatrix);

        Eigen::Vector3d t(tran_x , tran_y , tran_z );
        Eigen::Matrix4d transformMatrix_c2l;
        transformMatrix_c2l.setIdentity();
        transformMatrix_c2l.block<3, 3>(0, 0) = RotationMatrix;
        transformMatrix_c2l.topRightCorner(3, 1) = t;
        Eigen::Matrix4d transformMatrix_l2c = transformMatrix_c2l.inverse();

3.计算投影点并绘图 pt

cv::Mat X(3,1,cv::DataType<double>::type);
cv::Mat Y(3,1,cv::DataType<double>::type);
for (pcl::PointCloud<MyPointType>::const_iterator it = cloud_roi->begin(); it != cloud_roi->end(); it++)
{
                        
        X.at<double>(0,0)=it->x;
        X.at<double>(1,0)=it->y;
        X.at<double>(2,0)=it->z;
          
        Y = Camera_inMat * X;

        cv::Point pt;
        pt.x = Y.at<double>(0, 0) / Y.at<double>(2, 0); 
        pt.y = Y.at<double>(1, 0) / Y.at<double>(2, 0);
            
        cv::circle(image, pt, 2, CV_RGB(255, 0 , 255 ), -1);  
}

另外,cam_lidar_calibration包中投影点的过程好像有问题,建议使用以上代码。

参考:

​​​​​自动驾驶视觉融合-相机校准与激光点云投影 - 知乎 (zhihu.com)

激光雷达和相机的联合标定的实现(源代码,干货满满) - 知乎 (zhihu.com)

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
YOLOv4是一种基于深度学习的目标检测算法,它可以在图像中快速而准确地识别目标。但是,对于激光雷达点云数据,需要进行适当的处理才能使用YOLOv4算法进行目标检测。 以下是使用YOLOv4完成激光雷达点云下的3D目标检测的步骤: 1. 数据预处理:将激光雷达点云数据转换为图像数据,通常使用三维空间中的投影方式将点云数据映射到二维图像上。在这个过程中需要考虑一些因素,例如相机的位置和方向以及图像的分辨率等。 2. 数据标注:对于用于训练模型的数据,需要进行标注。对于激光雷达点云数据,通常使用包围盒(bounding box)进行标注,即在点云中画出一个框框来表示目标物体的位置和大小。 3. 模型训练:使用标注好的数据训练YOLOv4模型。由于激光雷达点云数据的特殊性,需要对YOLOv4模型进行一些改进,例如将原来的卷积层换成点云处理模块等。 4. 模型测试:使用训练好的模型对新的激光雷达点云数据进行测试。模型会输出每个检测到的物体的位置和大小。 5. 后处理:对于检测到的物体,需要进行一些后处理。例如,可以使用非极大值抑制(NMS)算法来去除重叠的检测框。此外,还可以使用一些过滤器来排除掉不符合要求的检测结果。 总之,使用YOLOv4完成激光雷达点云下的3D目标检测需要进行数据预处理、数据标注、模型训练、模型测试和后处理等多个步骤。需要注意的是,在处理激光雷达点云数据时,需要考虑到数据的特殊性,并对模型进行适当的改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可见一班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值