PCL学习之获取点云

刚入门学习PCL点云库,有些基础东西比较茫然。比如已经存在由RGB-D sensor获取的rgb image和depth image,如何将其转化为点云。下面,以比较通用的点云类型pcl::PointXYZRGB为例,讲述如何获取对应的点云数据。

**

code:

**
pcl::PointCloud::Ptr depth2cloud( cv::Mat rgb_image, cv::Mat depth_image )
{
float f = 570.3;
float cx = 320.0, cy = 240.0;

pcl::PointCloud::Ptr cloud_ptr( new     pcl::PointCloud () );
cloud_ptr->width  = rgb_image.cols;
cloud_ptr->height = rgb_image.rows;
cloud_ptr->is_dense = false;

for ( int y = 0; y < rgb_image.rows; ++ y ) {
    for ( int x = 0; x < rgb_image.cols; ++ x ) {
        pcl::PointXYZRGB pt;
        if ( depth_image.at(y, x) != 0 )
        {
            pt.z = depth_image.at(y, x)/1000.0;
            pt.x = (x-cx)*pt.z/f;
            pt.y = (y-cy)*pt.z/f;
            pt.r = rgb_image.at(y, x)[2];
            pt.g = rgb_image.at(y, x)[1];
            pt.b = rgb_image.at(y, x)[0];
            cloud_ptr->points.push_back( pt );
        }
        else
        {
            pt.x = std::numeric_limits::quiet_NaN();
            pt.y = std::numeric_limits::quiet_NaN();
            pt.z = std::numeric_limits::quiet_NaN();
            pt.r = rgb_image.at(y, x)[2];
            pt.g = rgb_image.at(y, x)[1];
            pt.b = rgb_image.at(y, x)[0];
            cloud_ptr->points.push_back( pt );
        }
    }
}
return cloud_ptr;

}
上面是一个函数,输入是rgb image和depth image,输出是一个指向pcl::PointXYZRGB类型点云的boost指针。这里需要说明的是,由于我在通过RGB-D sensor获取rgb image和depth image时,将深度缺失的像素位置对应的深度设置为0,故在转换函数中,我是通过深度值是否为0进行深度缺失判断的,读者可以根据自己的数据进行相应的修改,主要是为了区分深度缺失与否,影响不大。

main函数

int main(int argc,char* argv[])
{

cv::Mat depth;
cv::Mat image;
image=cv::imread(argv[1]);
depth=cv::imread(argv[2]);
if(!image.data||!depth.data)
    return -1;
pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
cloud=depth2cloud(image,depth);

return 0;

}

由于我是在ubuntu下进行的实验,所以对于pcl配置没怎么花太多精力(主要是之前在windows下,几次配置都不成功,也就转为ubuntu了,感觉还是比较方便的。)

**

CMakeLists.txt

PCL学习之获取点云_第1张图片
由于直接复制粘贴,文本显示会有问题,我就索性直接截图给大家看了。总的代码就交代完全了,如果读者对ubuntu下编译程序不是特别清楚,可以百度搜索参考资料《Cmake 实践》。

**

你可能感兴趣的:(PCL学习)