• PCL1.8单张图点云转换显示


    // C++ 标准库
    #include <iostream>
    #include <string>
    using namespace std;
    
    // OpenCV 库
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    // PCL 库
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/visualization/cloud_viewer.h>//可视化头文件
    // 定义点云类型
    typedef pcl::PointXYZRGBA PointT;//你看修饰符,RGBA很有意思,很直白
    typedef pcl::PointCloud<PointT> PointCloud; 
    
    // 相机内参
    const double camera_factor = 1000;
    const double camera_cx = 325.5;
    const double camera_cy = 253.5;
    const double camera_fx = 518.0;
    const double camera_fy = 519.0;
    
    
    
    // 主函数 
    int main( int argc, char** argv )
    {
        // 读取./data/rgb.png和./data/depth.png,并转化为点云
    
        // 图像矩阵
        cv::Mat rgb, depth;
        // 使用cv::imread()来读取图像
        rgb = cv::imread( "color_00.png" );//这个图有四个通道
        // rgb 图像是8UC3的彩色图像
        // depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改
        depth = cv::imread( "depth_00.png", -1 );
    
        // 点云变量
        // 使用智能指针,创建一个空点云。这种指针用完会自动释放。
        PointCloud::Ptr cloud ( new PointCloud );
        // 遍历深度图
        for (int m = 0; m < depth.rows; m++)
            for (int n=0; n < depth.cols; n++)
            {
                // 获取深度图中(m,n)处的值
                ushort d = depth.ptr<ushort>(m)[n];
                // d 可能没有值,若如此,跳过此点
                if (d == 0)
                    continue;
                // d 存在值,则向点云增加一个点
                PointT p;
    
                // 计算这个点的空间坐标
                p.z = double(d) / camera_factor;
                p.x = (n - camera_cx) * p.z / camera_fx;
                //由于PCL与opencv 图像坐标系 y轴是相反的,所以我加一个负号,是为了生成点云更加容易观察
                p.y = -(m - camera_cy) * p.z / camera_fy;
                
                // 从rgb图像中获取它的颜色
                // rgb是三通道的BGR格式图,所以按下面的顺序获取颜色
                p.b = rgb.ptr<uchar>(m)[n*3];
                p.g = rgb.ptr<uchar>(m)[n*3+1];
                p.r = rgb.ptr<uchar>(m)[n*3+2];
                p.a = rgb.ptr<uchar>(m)[n*3+3];//这个是Alpha通道
                // 把p加入到点云中
                cloud->points.push_back( p );
            }
        // 设置并保存点云
        cloud->height = 1;
        cloud->width = cloud->points.size();
        cout<<"point cloud size = "<<cloud->points.size()<<endl;
        cloud->is_dense = false;
        //pcl::io::savePCDFile( "./pointcloud.pcd", *cloud );
        // 清除数据并退出
        //cloud->points.clear();
        //cout<<"Point cloud saved."<<endl;
    
    
        //可视化
        pcl::visualization::CloudViewer viewer("viewer");
        viewer.showCloud(cloud);
        while (!viewer.wasStopped())
        {
        }
    
        return 0;
    }
  • 相关阅读:
    HTTPHelper
    C# 捕获全局亲测可用
    C# Excel的读写
    C# combox 绑定数据
    MySQL在CenterOS和Ubuntu的安装
    VMware虚拟机里的Centos7的IP
    Docker安装和部署
    linux安装git方法(转)
    mysql安装最后一步 Apply Security Settings 出错
    Linux下安装MySQL
  • 原文地址:https://www.cnblogs.com/winslam/p/9001056.html
Copyright © 2020-2023  润新知