三维数据的获取方式
RGBD相机和深度图
代码展示:在pcl中,把点云转为深度图,并保存和可视化
三维数据的获取方式
在计算机视觉和遥感领域,点云可以通过四种主要的技术获得,
(1)根据图像衍生而得,比如通过双目相机,
(2)基于RGBD相机获取点云
(3)基于光探测距离和测距系统比如lidar,
(4)Synthetic Aperture Radar (SAR)系统获取,基于这些不同的原理系统获取的点云数据,其数据的特征和应用的范围也是多种多样
RGBD相机和深度图
(1)深度图的原理:用深度值z值 当作像素值
(2)深度图获取原理:
代码展示:在pcl中,把点云转为深度图,并保存和可视化
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/common/common_headers.h>
#include <pcl/range_image/range_image.h> //点云转深度头文件
#include <pcl/visualization/range_image_visualizer.h> //深度图像可视化
#include <pcl/visualization/pcl_visualizer.h>//点云可视化
#include <boost/thread/thread.hpp>//多线程
#include <pcl/io/png_io.h>//保存深度图像
#include <pcl/visualization/common/float_image_utils.h>//保存深度图像
int main(int argc, char** argv) {
pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/zmy_719/vs_pcl/bun0.pcd", *pointCloud);
//以1度为角分辨率,从上面创建的点云创建深度图像。
//深度图像中的一个像素对应的角度大小1°,角度转弧度
float angularResolution = (float)(1.0f * (M_PI / 180.0f));
// 360.0度转弧度,扫描的水平宽度是360°
float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
// 180.0度转弧度,扫描的垂直高度是180°
float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));
//采集位置,传感器的初始位姿
Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
//选择的系统 X轴是向右,Y轴向下,Z轴向前
//如果选择是LASER_FRAME,则X轴向前,Y轴向左,Z轴向上
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
//noiseLevel如果设置为0.05就是5cm为半径的圆内的所有点的平均值,得到的深度值为准
float noiseLevel = 0.00;
//minRange大于0,假设为r,那么r内的所有点被忽略,为盲区
float minRange = 0.0f;
int borderSize = 1;
//-------------------生成深度图像------------------------
pcl::RangeImage::Ptr rangeImage_ptr(new pcl::RangeImage);
pcl::RangeImage& rangeImage = *rangeImage_ptr;
rangeImage.createFromPointCloud(*pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
//-------------------读取深度图像信息------------------------
std::cout << rangeImage << "\n";
//-------------------深度图的保存------------------------
float* ranges = rangeImage.getRangesArray();
unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, rangeImage.width, rangeImage.height);
//------------------可视化点云----------------------
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
//设置背景颜色
viewer1->setBackgroundColor(0, 0, 0);
//添加点云
viewer1->addPointCloud(pointCloud, "point cloud");
viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "point cloud");
viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "point cloud");
//------------------可视化深度图像----------------------
//方法一:从点云中可视化深度图像
boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("RangeImage Viewer"));
viewer->setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointWithRange> range_image_color_handler(rangeImage_ptr, "z");
viewer->addPointCloud(rangeImage_ptr, range_image_color_handler, "range image");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image");
viewer->initCameraParameters();
//方法二:以图像的形式显示深度图像,深度值作为颜色显示
pcl::visualization::RangeImageVisualizer range_image_widget("Range image");
range_image_widget.setWindowTitle("RangeImage");
range_image_widget.showRangeImage(rangeImage);
range_image_widget.setSize(1000, 1000);
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
system("pause");
return 0;
}
结果展示:
代码参考:PCL官网
原文链接:https://blog.csdn.net/adfjadsklf/article/details/119082844
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/jacke121/article/details/125396255
内容来源于网络,如有侵权,请联系作者删除!