【PCL】【PCL实践】【PCL的使用学习记录】

【PCL】【PCL实践】【PCL的使用学习记录】

  • 0 前言
  • 1 PCL的使用说明
    • 1.1 头文件的使用
    • 1.2 CMakeLists.txt的使用
    • 1.3 代码的使用
      • 1.3.1 定义点云使用的格式
        • 1.3.1.1 XYZRGB格式
      • 1.3.2 新建一个点云
      • 1.3.3 使用五对`RGB图`和`深度图`为点云赋值
      • 1.3.4 点云的大小
      • 1.3.5 保存点云为`.pcd`文件
      • 1.3.6 可视化点云

0 前言

  • 全文代码参考【slam十四讲第二版】【课本例题代码向】【第五讲~相机与图像】【opencv3.4.1安装】【OpenCV、图像去畸变、双目和RGB-D、遍历图像像素14种】的6 RGB-D视觉

1 PCL的使用说明

1.1 头文件的使用

  1. pcl点云和可视化
#include 
#include 
#include 

1.2 CMakeLists.txt的使用

# pcl
#find_package( PCL REQUIRED COMPONENT common io)
find_package( PCL 1.8 REQUIRED)
set(PCL_INCLUDE_DIRS /usr/include/pcl-1.8)  #指定pcl1.8路径
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )

add_executable( xxx src/xxx.cpp )
target_link_libraries( xxx ${OpenCV_LIBS} ${PCL_LIBRARIES} )

1.3 代码的使用

1.3.1 定义点云使用的格式

1.3.1.1 XYZRGB格式

    // 定义点云使用的格式:这里用的是XYZRGB
    typedef pcl::PointXYZRGB PointT;
    typedef pcl::PointCloud<PointT> PointCloud;

1.3.2 新建一个点云

    // 新建一个点云
    PointCloud::Ptr pointCloud( new PointCloud );

1.3.3 使用五对RGB图深度图为点云赋值

    for ( int i=0; i<5; i++ )
    {
        cout<<"转换图像中: "<<i+1<<endl;
        cv::Mat color = colorImgs[i];
        cv::Mat depth = depthImgs[i];
        Eigen::Isometry3d T = poses[i];
        for ( int v=0; v<color.rows; v++ )
            for ( int u=0; u<color.cols; u++ )
            {
                unsigned int d = depth.ptr<unsigned short> ( v )[u]; // 深度值
                if ( d==0 ) continue; // 为0表示没有测量到
                Eigen::Vector3d point;
                point[2] = double(d)/depthScale;
                point[0] = (u-cx)*point[2]/fx;
                point[1] = (v-cy)*point[2]/fy;
                Eigen::Vector3d pointWorld = T*point;

                PointT p ;
                p.x = pointWorld[0];
                p.y = pointWorld[1];
                p.z = pointWorld[2];
                p.b = color.data[ v*color.step+u*color.channels() ];//在OpenCV彩色图像中,通道的默认顺序是B、G、R
                p.g = color.data[ v*color.step+u*color.channels()+1 ];
                p.r = color.data[ v*color.step+u*color.channels()+2 ];
                pointCloud->points.push_back( p );

            }
    }
        pointCloud->is_dense = false;

1.3.4 点云的大小

    cout<<"点云共有"<<pointCloud->size()<<"个点."<<endl;

输出:

点云共有1081843个点.

1.3.5 保存点云为.pcd文件

    pcl::io::savePCDFileBinary("map.pcd", *pointCloud );

1.3.6 可视化点云

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
    viewer->setBackgroundColor (0, 0, 0);
    pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(pointCloud);//pointCloud类型为1.3.1和1.3.2的PointCloud::Ptr
    viewer->addPointCloud<pcl::PointXYZRGB> (pointCloud, rgb, "sample cloud");//pointCloud类型为1.3.1和1.3.2的PointCloud::Ptr
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
    //viewer->addCoordinateSystem (1.0);
    viewer->initCameraParameters ();
    while (!viewer->wasStopped ())
    {
        //调用spinOnce,给视窗处理事件的时间,可以允许用户和电脑进行交互
        viewer->spinOnce (100);
        boost::this_thread::sleep (boost::posix_time::microseconds (100000));
    }

你可能感兴趣的:(视觉SLAM14讲,学习,计算机视觉,人工智能)