PCL从点云创建深度图像

标签: PCL  深度图像
31人阅读 评论(0) 收藏 举报
分类:

构造点云数据

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.0 - y;
            point.y = y;
            point.z = z;
            pointcloud.points.push_back(point);
        }
    }
    pointcloud.width = (uint32_t)pointcloud.points.size();
    pointcloud.height = 1;

创建深度图像

    //定义参数
    float angularResolution = (float)(1.0f * (M_PI / 180.0f));//角分辨率是1度,也就是说由相邻像素表示的光束相差一弧度
    float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
    float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));//模拟的范围传感器有一个完整的360度全景图
    Eigen::Affine3f sensorPose = (Eigen::Affine3f) Eigen::Translation3f(0.0f, 0.0f, 0.0f);//传感器的位置定义了虚拟传感器的6 DOF位置,它的原点是滚动=俯仰=偏航=0。
    pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;//x朝向右,y向下,z轴是向前的,另一种选择是激光框架,x面向前方,y向左,z向上。
    float noiseLevel = 0.00;//对于噪声,噪声是0,范围图像是使用普通的z缓冲区创建的
    float minRange = 0.0f;// minRange >0 ,所有更近的点都将被忽略
    int borderSize = 1;//边界大小>0,边界将会在裁剪时留下一个未被观察到的点的边界。

    pcl::RangeImage rangeImage;
    rangeImage.createFromPointCloud(pointcloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose,
        coordinate_frame, noiseLevel, minRange, borderSize);

可视化

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

    std::cout << rangeImage << "\n";
    std::cout << pointcloud << "\n";
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("viewer"));
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> colorhandler(pointcloud.makeShared(), 255, 0, 0);
    viewer->addPointCloud(pointcloud.makeShared(), colorhandler,"cloud");
    viewer->setBackgroundColor(1, 1, 1);
    viewer->setCameraPosition(
        0, 0, 0,
        0, 0, -1,
        0, 0, 0);
    viewer->addCoordinateSystem(1, "cloud");

可视化结果

这里写图片描述这里写图片描述

完整代码

#include "stdafx.h"
#include <iostream>
#include <pcl\visualization\pcl_plotter.h>
#include <pcl\visualization\pcl_visualizer.h>
#include <pcl\point_types.h>
#include <pcl\point_cloud.h>
#include <pcl\range_image\range_image.h>
#include <pcl\visualization\range_image_visualizer.h>
#include <vector>

int _tmain(int argc, _TCHAR* 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.0 - y;
            point.y = y;
            point.z = z;
            pointcloud.points.push_back(point);
        }
    }
    pointcloud.width = (uint32_t)pointcloud.points.size();
    pointcloud.height = 1;

    //定义参数
    float angularResolution = (float)(1.0f * (M_PI / 180.0f));//角分辨率是1度,也就是说由相邻像素表示的光束相差一弧度
    float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
    float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));//模拟的范围传感器有一个完整的360度全景图
    Eigen::Affine3f sensorPose = (Eigen::Affine3f) Eigen::Translation3f(0.0f, 0.0f, 0.0f);//传感器的位置定义了虚拟传感器的6 DOF位置,它的原点是滚动=俯仰=偏航=0。
    pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;//x朝向右,y向下,z轴是向前的,另一种选择是激光框架,x面向前方,y向左,z向上。
    float noiseLevel = 0.00;//对于噪声,噪声是0,范围图像是使用普通的z缓冲区创建的
    float minRange = 0.0f;// minRange >0 ,所有更近的点都将被忽略
    int borderSize = 1;//边界大小>0,边界将会在裁剪时留下一个未被观察到的点的边界。

    pcl::RangeImage rangeImage;
    rangeImage.createFromPointCloud(pointcloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose,
        coordinate_frame, noiseLevel, minRange, borderSize);

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

    std::cout << rangeImage << "\n";
    std::cout << pointcloud << "\n";
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("viewer"));
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> colorhandler(pointcloud.makeShared(), 255, 0, 0);
    viewer->addPointCloud(pointcloud.makeShared(), colorhandler,"cloud");
    viewer->setBackgroundColor(1, 1, 1);
    viewer->setCameraPosition(
        0, 0, 0,
        0, 0, -1,
        0, 0, 0);
    viewer->addCoordinateSystem(1, "cloud");
    while (!viewer->wasStopped())
    {
        viewer->spinOnce();
    }
    system("pause");
    return 0;
}

参考文献
[1]. http://pointclouds.org/documentation/tutorials/range_image_creation.php#range-image-creation

查看评论

从一个点云里面创建一个深度图

这次,我们将显示如何从一个点云和一个给定的传感器来创造深度图。下面的代码,创建了一个在观察者前面的矩形。 #include int main (int argc, char** argv) ...
  • qq_25491201
  • qq_25491201
  • 2016-04-13 20:36:30
  • 21013

结合彩色图和深度图创建点云(OpenCV+OpenNI+PCL)

试验了好久了,终于成功了!用OpenNI获取彩色和深度数据流,转化成OpenCV的Mat图像格式。 对相机进行标定,获取相机的内部参数: Calibration results after optim...
  • kh1445291129
  • kh1445291129
  • 2015-03-26 01:22:42
  • 5366

由点云创建深度图

首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第9章例1文件夹中,打开名为range_image_creation.cpp的代码文件。 解释说明 下面来解析打开源...
  • wkxxuanzijie920129
  • wkxxuanzijie920129
  • 2016-09-06 10:31:41
  • 1276

PCL编程->点云转深度图显示

点云转深度图显示函数: void depthvisual() { // Object for storing the point cloud. pcl::PointCloud::Ptr clou...
  • sunboyiris
  • sunboyiris
  • 2017-08-21 17:28:20
  • 1268

PCL1.8创建深度图并保存成png格式图片代码(生成深度图的原理一般就是透视投影或者正交投影)

PCL创建深度图(官网有创建深度图例子)并保存成png格式图片: 主要代码: //①以下生成点云cloud2在某个角度下的深度图 float angularResolution = (float)(1...
  • baidu_26408419
  • baidu_26408419
  • 2016-12-28 19:34:35
  • 1841

PCL系列——从深度图像(RangeImage)中提取NARF关键点

PCL系列 PCL系列——读入PCD格式文件操作 PCL系列——将点云数据写入PCD格式文件 PCL系列——拼接两个点云 PCL系列——从深度图像(RangeImage)中提取NARF关键点 说明 通...
  • xuezhisdc
  • xuezhisdc
  • 2016-03-30 20:14:37
  • 6685

PCL系列——如何可视化深度图像

PCL系列 PCL系列——读入PCD格式文件操作 PCL系列——将点云数据写入PCD格式文件 PCL系列——拼接两个点云 PCL系列——从深度图像(RangeImage)中提取NARF关键点 PCL系...
  • xuezhisdc
  • xuezhisdc
  • 2016-03-30 21:20:25
  • 9481

PCL点云-RGBD图像转换到点云

  • 2017年12月20日 12:50
  • 2KB
  • 下载

通过Kinect的深度图像数据计算三维点云

本文来自http://www.cnblogs.com/JohnShao/archive/2011/05/22/2053496.html 在可以透過 OpenNI 讀取到 Kinect 的...
  • Lixam
  • Lixam
  • 2012-06-05 15:33:21
  • 17814

从深度图里面导出边界

这次我们将学着怎么从一个深度图里面导出边界。我们对3种不同种类的点很感兴趣:物体的边框的点,阴影边框点,和面纱点(在障碍物边界和阴影边界),这是一个很典型的现象在通过雷达获取的3D深度。 下面是代码...
  • qq_25491201
  • qq_25491201
  • 2016-04-13 22:03:26
  • 19129
    个人资料
    持之以恒
    等级:
    访问量: 729
    积分: 271
    排名: 28万+
    文章分类
    文章存档