PCL——点云到深度图的变换与曲面重建

2023-12-31 13:38

本文主要是介绍PCL——点云到深度图的变换与曲面重建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点云到深度图的变换与曲面重建

点云数据需要通过k-d tree等索引来对数据进行检索;
深度图和图像类似,可以通过上下左右等近邻来直接进行索引。
所以有必要将点云数据转换为深度图像,进而使用PCL内部只适用于深度图像的算法来进行曲面重建等。
代码实现:

#include <pcl/range_image/range_image.h>
#include <pcl/range_image/range_image_planar.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/integral_image_normal.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/console/print.h>
#include <pcl/surface/organized_fast_mesh.h>
#include <pcl/console/time.h>
#include <Eigen/StdVector>
#include <Eigen/Geometry>
#include <iostream>
#include <pcl/surface/impl/organized_fast_mesh.hpp> 
#include <boost/thread/thread.hpp>#include <pcl/common/common_headers.h>#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
using namespace pcl::console;
int main (int argc, char** argv) {// Generate the dataif (argc<2){print_error ("Syntax is: %s input.pcd -w 640 -h 480 -cx 320 -cy 240 -fx 525 -fy 525 -type 0 -size 2\n", argv[0]);print_info ("  where options are:\n");print_info ("                     -w X = width of detph iamge ");return -1;}std::string filename = argv[1];//深度图像的宽度、高度、光轴在深度图像上的坐标点、成像的焦距int width=640,height=480,size=2,type=0;float fx=525,fy=525,cx=320,cy=240;parse_argument (argc, argv, "-w", width);//深度图像的宽度parse_argument (argc, argv, "-h", height);//深度图像的高度parse_argument (argc, argv, "-cx", cx);//光轴在深度图像上的x坐标parse_argument (argc, argv, "-cy", cy);//光轴在深度图像上的y坐标parse_argument (argc, argv, "-fx", fx);//水平方向的焦距parse_argument (argc, argv, "-fy", fy);//垂直方向的焦距parse_argument (argc, argv, "-type", type);//曲面重建时三角化的方式parse_argument (argc, argv, "-size", size);//曲面重建时的面片的大小//convert unorignized point cloud to orginized point cloud beginpcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);pcl::io::loadPCDFile (filename, *cloud);print_info ("Read pcd file successfully\n");Eigen::Affine3f sensorPose;//相机的位姿sensorPose.setIdentity(); pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;//成像时遵循的坐标系统float noiseLevel=0.00;float minRange = 0.0f;//创建了RangeImagePlanar对象,利用该对象的函数createFromPointCloudWithFixedSize()进行深度图像的生成pcl::RangeImagePlanar::Ptr rangeImage(new pcl::RangeImagePlanar);rangeImage->createFromPointCloudWithFixedSize(*cloud,width,height,cx,cy,fx,fy,sensorPose,coordinate_frame);std::cout << rangeImage << "\n";//convert unorignized point cloud to orginized point cloud end//viusalization of range imagepcl::visualization::RangeImageVisualizer range_image_widget ("点云库PCL从入门到精通1");range_image_widget.showRangeImage (*rangeImage);range_image_widget.setWindowTitle("点云库PCL从入门到精通2");//triangulation based on range imagepcl::OrganizedFastMesh<pcl::PointWithRange>::Ptr tri(new pcl::OrganizedFastMesh<pcl::PointWithRange>);pcl::search::KdTree<pcl::PointWithRange>::Ptr tree (new pcl::search::KdTree<pcl::PointWithRange>);tree->setInputCloud(rangeImage);pcl::PolygonMesh triangles;tri->setTrianglePixelSize(size);//参数size控制重建曲面的精细程度tri->setInputCloud(rangeImage);tri->setSearchMethod(tree);tri->setTriangulationType((pcl::OrganizedFastMesh<pcl::PointWithRange>::TriangulationType)type);//设置的三角化的类型,是个枚举类型,包含三角形、四边形等tri->reconstruct(triangles);boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("点云库PCL从入门到精通3"));viewer->setBackgroundColor(0.5,0.5,0.5);viewer->addPolygonMesh(triangles,"tin");viewer->addCoordinateSystem();while (!range_image_widget.wasStopped ()&&!viewer->wasStopped()){range_image_widget.spinOnce ();pcl_sleep (0.01);viewer->spinOnce ();}
}

命令行执行语句:
…>greedy_projection.exe …/1.pcd -size 5
运行结果:
深度图可视化结果
在这里插入图片描述
曲面重建结果
在这里插入图片描述
命令行执行语句:
…>greedy_projection.exe …/1.pcd -size 20
运行结果:
深度图可视化结果
在这里插入图片描述
曲面重建结果
在这里插入图片描述
说明:命令行参数中,第一个为输入点云,第二个用于控制重建曲面的精细程度,由以上两个不同的精细程度的参数的设置,可以看到重建的结果的精细程度有所改变。

这篇关于PCL——点云到深度图的变换与曲面重建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556190

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

🎯要点 🎯受激发射损耗显微镜算法模型:🖊恢复嘈杂二维和三维图像 | 🖊模型架构:恢复上下文信息和超分辨率图像 | 🖊使用嘈杂和高信噪比的图像训练模型 | 🖊准备半合成训练集 | 🖊优化沙邦尼尔损失和边缘损失 | 🖊使用峰值信噪比、归一化均方误差和多尺度结构相似性指数量化结果 | 🎯训练荧光显微镜模型和对抗网络图形转换模型 🍪语言内容分比 🍇Python图像归一化

JD 1385:重建二叉树

OJ题目:click here~~ 题目分析:给前序遍历序列和中序遍历序列,重构二叉树并输出后序遍历序列 剑指offer 面试题6 AC_CODE int pre[1008] , in[1008] ;struct Node{int x ;Node *left ;Node *right ;};bool buildsubtree(Node*& root , int* spre , in

【数字信号处理】一文讲清FFT(快速傅里叶变换)

目录 快速傅里叶变换(Fast Fourier Transform,FFT)FFT的背景快速傅里叶变换(Fast Fourier Transform,FFT)DFT的数学表达实际计算重要性和应用频谱泄露、频谱混叠奈奎斯特采样定理参考链接 快速傅里叶变换(Fast Fourier Transform,FFT) FFT的背景 1、为什么要时域→频域频率?50Hz+频率120Hz

Activity转屏重建之 Activity.onConfigurationChanged

偶尔也会遇到由于转屏引起的一些问题。 有些时候,并不希望由于转屏使得Activity取重建。 再如键盘消失后的重建。 下面以一个demo为例子,小小总结一下用法。 如果想在转屏后,屏幕上立马打印出当前处于什么横竖屏状态 1.都知道有个属性android:configChanges可以用来定义什么情况下可以使得Activity不会restart。 android:configC

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

齐次变换矩阵的原理与应用

齐次变换矩阵的原理与应用 通过齐次变换矩阵,可以描述机械臂末端执行器(法兰)在三维空间中的平移和旋转操作。该矩阵结合了旋转和平移信息,用于坐标变换。 1. 齐次变换矩阵的基本形式 一个齐次变换矩阵 T是一个 4x4 矩阵,表示刚体的旋转和平移: T = [ R t 0 1 ] = [ r 11 r 12 r 13 x r 21 r 22 r 23 y r 31 r 32 r 33 z 0

Activity生命周期 与 重建

每一个Android应用程序在运行时,对于底层的Linux Kernel而言都是一个单独的进程,但是对于Android系统而言,因为局限于手机画面的大小与使用的考虑,不能把每一个运行中的应用程序窗口都显示出来。   所以通常手机系统的界面一次仅显示一个应用程序窗口,Android使用了Activity的概念来表示界面。   运行中的应用程序分为五大类,分别是:     前景模式

【conda】导出和重建 Conda 环境

目录 1. 导出 Conda 环境1.1 激活环境1.2 导出环境配置1.3 检查和编辑环境配置文件(可选)1.4 共享或重建环境 2. 常见问题及解决方案2.1 导出环境时出现 “PackagesNotFoundError”2.2 导出的 `environment.yml` 文件在其他系统上无法使用2.3 导出的环境文件过大2.4 如何处理 Conda 环境中的 pip 包2.5 在导出或

MATLAB分析图像的离散余弦变换(DCT)

1. MATLAB的介绍以及所需函数的说明:  1.1 MATLAB  MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks 公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设