当前位置:   article > 正文

基于标定数据将3D LiDAR点云与相机图像对齐(含C++版本代码)_opencv 图像点云对齐

opencv 图像点云对齐

这段C++代码演示了如何将Velodyne激光雷达的点云数据投影到相机图像上。该过程涉及以下主要步骤:

  1. 读取并解析来自文件的标定数据,包括P2矩阵、R0_rect矩阵和Tr_velo_to_cam矩阵。这些矩阵用于将激光雷达点云从Velodyne坐标系转换到相机坐标系。
  2. 从二进制文件中读取Velodyne激光雷达点云数据,并将其存储在Eigen矩阵中。
  3. 使用标定矩阵将Velodyne点云从Velodyne坐标系转换到相机坐标系。这涉及将点云与标定矩阵相乘。
  4. 过滤转换后的点云,移除深度值(Z坐标)为负的点。
  5. 通过将X和Y坐标除以相应的Z坐标,将转换后的3D点投影到2D图像平面上。
  6. 读取并显示对应的相机图像。
  7. 在相机图像上绘制投影点,仅绘制落在图像边界内的点。

1. 工程结构

2. CMakeLists.txt

  1. cmake_minimum_required(VERSION 3.5)
  2. project(velo2cam)
  3. set(CMAKE_CXX_STANDARD 11)
  4. find_package(OpenCV REQUIRED)
  5. include_directories(${OpenCV_INCLUDE_DIRS})
  6. # 找到并包含PCL
  7. find_package(PCL 1.8 REQUIRED)
  8. include_directories(${PCL_INCLUDE_DIRS})
  9. link_directories(${PCL_LIBRARY_DIRS})
  10. add_definitions(${PCL_DEFINITIONS})
  11. # Find Eigen
  12. find_package(Eigen3 REQUIRED)
  13. include_directories(${EIGEN3_INCLUDE_DIRS})
  14. add_executable(velo2cam main.cpp)
  15. target_link_libraries(velo2cam ${OpenCV_LIBS} Eigen3::Eigen ${PCL_LIBRARIES})

3. main.cpp

  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <string>
  5. #include <opencv2/opencv.hpp>
  6. #include <pcl/point_types.h>
  7. #include <pcl/visualization/pcl_visualizer.h>
  8. #include <thread>
  9. #include <Eigen/Dense>
  10. using namespace std;
  11. using namespace cv;
  12. using namespace Eigen;
  13. int main(int argc, char** argv) {
  14. // 得到 000007
  15. int sn = (argc > 1) ? stoi(argv[1]) : 396; // Default 0-7517
  16. string name = to_string(sn);
  17. name = string(6 - name.length(), '0') + name; // 6 digit zeropadding
  18. cout << name <<endl;
  19. // 读取标定数据文件
  20. string calib_file = "/home/fairlee/CLionProjects/velo2cam/testing/calib/" + name + ".txt";
  21. ifstream calib_fin(calib_file);
  22. vector<string> calib_lines;
  23. string line;
  24. while (getline(calib_fin, line)) {
  25. calib_lines.push_back(line);
  26. }
  27. calib_fin.close();
  28. // 初始化P2矩阵(3x4) 从标定数据的第3行解析P2矩阵
  29. Matrix<double, 3, 4> P2;
  30. istringstream P2_ss(calib_lines[2].substr(calib_lines[2].find(" ") + 1));
  31. for (int i = 0; i < P2.rows(); ++i) {
  32. for (int j = 0; j <
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/890926
推荐阅读
相关标签
  

闽ICP备14008679号