点云转深度图:转化,保存,可视化

三维数据的获取方式
RGBD相机和深度图
代码展示:在pcl中,把点云转为深度图,并保存和可视化
三维数据的获取方式
在计算机视觉和遥感领域,点云可以通过四种主要的技术获得,
(1)根据图像衍生而得,比如通过双目相机,
(2)基于RGBD相机获取点云
(3)基于光探测距离和测距系统比如lidar,
(4)Synthetic Aperture Radar (SAR)系统获取,基于这些不同的原理系统获取的点云数据,其数据的特征和应用的范围也是多种多样

RGBD相机和深度图
(1)深度图的原理:用深度值z值 当作像素值
(2)深度图获取原理:

点云转深度图:转化,保存,可视化_第1张图片

点云转深度图:转化,保存,可视化_第2张图片 

 

代码展示:在pcl中,把点云转为深度图,并保存和可视化

#include 
#include  
#include 
#include  //点云转深度头文件
#include  //深度图像可视化
#include //点云可视化
#include //多线程
#include //保存深度图像
#include //保存深度图像
int main(int argc, char** argv) {
    pcl::PointCloud::Ptr pointCloud(new pcl::PointCloud);
    pcl::io::loadPCDFile("D:/zmy_719/vs_pcl/bun0.pcd", *pointCloud);

    //以1度为角分辨率,从上面创建的点云创建深度图像。
    //深度图像中的一个像素对应的角度大小1°,角度转弧度
    float angularResolution = (float)(1.0f * (M_PI / 180.0f));
    
    // 360.0度转弧度,扫描的水平宽度是360°
    float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));

    // 180.0度转弧度,扫描的垂直高度是180°
    float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));

    //采集位置,传感器的初始位姿
    Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
    
    //选择的系统 X轴是向右,Y轴向下,Z轴向前
    //如果选择是LASER_FRAME,则X轴向前,Y轴向左,Z轴向上
    pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
    
    //noiseLevel如果设置为0.05就是5cm为半径的圆内的所有点的平均值,得到的深度值为准
    float noiseLevel = 0.00;

    //minRange大于0,假设为r,那么r内的所有点被忽略,为盲区
    float minRange = 0.0f;
    int borderSize = 1;

    //-------------------生成深度图像------------------------
    pcl::RangeImage::Ptr rangeImage_ptr(new pcl::RangeImage);
    pcl::RangeImage& rangeImage = *rangeImage_ptr;
    rangeImage.createFromPointCloud(*pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
    //-------------------读取深度图像信息------------------------
    std::cout << rangeImage << "\n";

    //-------------------深度图的保存------------------------
    float* ranges = rangeImage.getRangesArray();
    unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
    pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, rangeImage.width, rangeImage.height);

    //------------------可视化点云----------------------
    boost::shared_ptr viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
    //设置背景颜色
    viewer1->setBackgroundColor(0, 0, 0);
    //添加点云
    viewer1->addPointCloud(pointCloud, "point cloud");
    viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "point cloud");
    viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "point cloud");
        
    //------------------可视化深度图像----------------------
    //方法一:从点云中可视化深度图像
    boost::shared_ptrviewer(new pcl::visualization::PCLVisualizer("RangeImage Viewer"));
    viewer->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色
    pcl::visualization::PointCloudColorHandlerGenericField range_image_color_handler(rangeImage_ptr, "z");
    viewer->addPointCloud(rangeImage_ptr, range_image_color_handler, "range image");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image");
    viewer->initCameraParameters();

    //方法二:以图像的形式显示深度图像,深度值作为颜色显示
    pcl::visualization::RangeImageVisualizer range_image_widget("Range image");
    range_image_widget.setWindowTitle("RangeImage");
    range_image_widget.showRangeImage(rangeImage);
    range_image_widget.setSize(1000, 1000);

        while (!viewer->wasStopped())
        {
            viewer->spinOnce(100);
            boost::this_thread::sleep(boost::posix_time::microseconds(100000));
        }

    system("pause");
    return 0;
}



结果展示:

点云转深度图:转化,保存,可视化_第3张图片

 

点云转深度图:转化,保存,可视化_第4张图片

点云转深度图:转化,保存,可视化_第5张图片 

 

代码参考:PCL官网

原文链接:https://blog.csdn.net/adfjadsklf/article/details/119082844

你可能感兴趣的:(pcl学习,3D视觉,点云转深度图)