Ubuntu 18.04.06 PCL C++学习记录(十三)

@[TOC]PCL中深度模块的学习

学习背景

参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.8.1,CMake版本为3.10.2

学习内容

如何从点云创建深度图,如何从点云和给定的传感器的位置来创建深度图像,此程序是生成一个矩形的点云,然后基于该点云创建深度图像

源代码及所用函数

源代码

#include<pcl/range_image/range_image.h>//深度图像头文件

int main(int argc,char** argv)
{
    pcl::PointCloud<pcl::PointXYZ> PointCloud;//定义点云对象
    //循环产生点云数据
    for (float y = -0.5f; y <= 0.5f; y+=0.01f)
    {
        for(float z = -0.5f;z <= 0.5f;z+=0.01f)
        {
            pcl::PointXYZ point;
            point.x = 2.0f -y;
            point.y = y;
            point.z = z;
            PointCloud.points.push_back(point);//循环添加点数据到点云对象
        }
    }
    PointCloud.width = (uint32_t)PointCloud.points.size();
    PointCloud.height = 1;

    //实现一个矩形形状的点云
    //现在,我们要根据上述点云创建角度分辨率为 1deg 的范围图像
    //M_PI 是 C++ 中定义的一个常量,表示数学常数 π(pi)的值
    //180.0f 是一个浮点型常量,表示 180 度
    //M_PI / 180.0f 的结果是将弧度转换为角度的转换因子。在数学中,π 弧度等于 180 度
    //所以 M_PI / 180.0f 的结果约为 0.01745,表示 1 度对应的弧度值
    float angualResolution = (float)(1.0f*(M_PI/180.0f));//1弧度
    //maxAngleWidth为模拟的深度传感器的水平最大采样角度
    float maxAngleWidth = (float)(360.0f*(M_PI/180.0f));//360弧度
    //maxAngleHeight为模拟传感器的垂直方向最大采样角度  都转为弧度
    float maxAngleHeight = (float)(180.0f*(M_PI/180.0f));//180弧度
    
    //传感器采集位置
    Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f,0.0f,0.0f);
    //深度图像遵循坐标系统
    pcl::RangeImage::CoordinateFrame coordinate_friam = pcl::RangeImage::CAMERA_FRAME;
    float noiseLevel = 0.00;//noise_level获取深度图像深度时,近邻点对查询点距离值的影响水平
    float minRange = 0.0f;     //min_range设置最小的获取距离,小于最小获取距离的位置为传感器的盲区
    int borderSize = 1;        //border_size获得深度图像的边缘的宽度
    pcl::RangeImage rangeImage;
    rangeImage.createFromPointCloud(PointCloud,angualResolution,maxAngleWidth,maxAngleHeight,
                                    sensorPose,coordinate_friam,noiseLevel,minRange,borderSize);
    std::cout<<rangeImage<<"\n"<<std::endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.1 FATAL_ERROR)#指定CMake的最低版本要求为3.1
project(range_image_creation)#设置项目名称
#set(CMAKE_CXX_STANDARD 11)#设置C++编译器版本为C++11
find_package(PCL 1.8 REQUIRED)#查找PCL库,要求版本为1.8或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (range_image_creation range_image_creation.cpp)#需要修改
target_link_libraries (range_image_creation ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

在这里插入图片描述

函数

createFromPointCloud 函数,将点云数据 PointCloud 转换为深度图像 rangeImage

rangeImage.createFromPointCloud(PointCloud,angualResolution,maxAngleWidth,maxAngleHeight,
                                sensorPose,coordinate_friam,noiseLevel,minRange,borderSize);

PointCloud: 输入的点云数据。

angualResolution: 深度图像的角度分辨率,单位为弧度。
maxAngleWidth: 深度图像在水平方向上的最大视角范围,单位为弧度。
maxAngleHeight: 深度图像在垂直方向上的最大视角范围,单位为弧度。
sensorPose: 传感器的位置和姿态,用一个仿射变换矩阵 Eigen::Affine3f 表示。这里设置为单位矩阵,即传感器位于原点并且没有旋转。
coordinate_friam: 深度图像所使用的坐标系统。这里设置为 CAMERA_FRAME,即相机坐标系统。
noiseLevel: 深度图像中的噪声水平。这里设置为 0,表示没有噪声。
minRange: 深度图像的最小深度范围。这里设置为 0,表示不限制最小深度。
borderSize: 深度图像边缘的宽度,用于插值计算。这里设置为 1。

补充内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值