PCL点云库学习

PCL学习

organized point cloud:具有某种结构的点云,例如来自立体视觉相机的点云。
projectable point cloud: 根据针孔相机模型,像素点与对应的3D点有如下关系, u=fx/z,v=fy/z

width:[1]点云中点的数量(unorganized point cloud); [2]点云中每行点的数量(organized point cloud)。
height:[1]被设置为1(unorganized point cloud);[2]点云的行数(organized point cloud)。

cloud.width=640;  //每行有640个点
cloud.height=480;  //点云有480行
pcl::PointCloud<pcl::PointXYZ> cloud;  //定义点云
std::vector<pcl::PointXYZ> data=cloud.points; //点云存储

使用PCL的CMakeLists.txt的写法

 cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
  //最小的cmake版本要求
  project(MY_GRAND_PROJECT)
  //项目名称
  find_package(PCL 1.3 REQUIRED COMPONENTS common io)
  //找到PCL1.3及以上的版本
  //REQUIRED表示找不到,cmake失败
  //COMPONENTS表示对PCL模块的要求
      要求一个模块:find_package(PCL 1.3 REQUIRED COMPONENTS io)
      要求多个模块:find_package(PCL 1.3 REQUIRED COMPONENTS io common)
      要求所有模块:find_package(PCL 1.3 REQUIRED)
  include_directories(${PCL_INCLUDE_DIRS})
  link_directories(${PCL_LIBRARY_DIRS})
  add_definitions(${PCL_DEFINITIONS})
  //如果PCL被找到的话,下面几个相关的变量就会被设置
      PCL_FOUND:PCL找到后就设置为1,否则未设置
      PCL_INCLUDE_DIRS:设置PCL头文件和依赖项头文件的安装路径
      PCL_LIBRARIES:设置构建和已安装PCL库的文件名
      PCL_LIBRARY_DIRS:设置PCL库和第三方依赖驻留的路径
      PCL_VERSION:找到的PCL版本
      PCL_COMPONENTS:列出所有的可用部分
      PCL_DEFINITIONS:列出所有需要的预处理器定义和编译器标志
  add_executable(pcd_write_test pcd_write.cpp)
  target_link_libraries(pcd_write_test ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})

如果PCL被以很奇怪的方式安装,可以通过在find_package之前加入set(PCL_DIR “/path/to/PCLConfig.cmake”)来帮助cmake找到PCL

使用点云的一个例子

   // 定义点云使用的格式:这里用的是XYZRGB
    typedef pcl::PointXYZRGB PointT; 
    typedef pcl::PointCloud<PointT> PointCloud;
    
    // 新建一个点云
    PointCloud::Ptr pointCloud( new PointCloud ); 
    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() ];
                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;
    cout<<"点云共有"<<pointCloud->size()<<"个点."<<endl;
    pcl::io::savePCDFileBinary("map.pcd", *pointCloud );


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值