1. 设置深度图像的宽度/高度 /光心坐标/焦距等,将从一个视点获取的点云转换为深度图。
void | createFromPointCloudWithFixedSize (const PointCloudType &point_cloud, int di_width, int di_height, float di_center_x, float di_center_y, float di_focal_length_x, float di_focal_length_y, const Eigen::Affine3f &sensor_pose, CoordinateFrame coordinate_frame=CAMERA_FRAME, float noise_level=0.0f, float min_range=0.0f) |
从已存在的点云中创建图像,其中, point_cloud 为指向创建深度图像所需点云的对象引用, di_width 是视差图像的宽度, di_height 是视差图像的高度, di_center_ x是照相机投影中心的 x 坐标, di _ center_y 是照相机投影中心的 y 坐标 , di_focal_length_x 是照相机水平方向上的焦距, di_ fo cal_ length_ y 是照相机垂直方向上的焦距, sensor_pose 为模拟深度照相机的位姿, coordinate_frame 为点云所使用的坐标系统, noise_level 为传感器的噪声水平,用于 z缓冲区求取深度时,如果噪声越大,查询点周围的点深度就会影响查询点的深度,如果无噪声,则直接取查询点 z 缓冲区中最小的距离为深度, min_range 为可见点的最小深度,小于该距离的点视为盲区,即不可见点。 |
2. 使用曲面重建模块的简单三角化类进行曲面重建。
#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 data
if (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); //光轴在深度图像上的x坐标
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 begin
pcl::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;
//点云数据转换为深度图
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 image
pcl::visualization::RangeImageVisualizer range_image_widget ("点云库PCL从入门到精通");
range_image_widget.showRangeImage (*rangeImage);
range_image_widget.setWindowTitle("点云库PCL从入门到精通");
//triangulation based on range image
pcl::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);
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从入门到精通"));
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 ..\\..\\source\\1.pcd -size 5
深度图像显示以及曲面重建结果可视化如下图: