深度图像
#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>
#ifdef WIN32//64位Debug应该加上
#define pcl_sleep(x) Sleep(1000*(x))
#elif _WIN64
#define pcl_sleep(x) Sleep(1000*(x))
#else
#define pcl_sleep(x) sleep(x)
#endif
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);//光轴在深度图像上的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 begin
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile("source.pcd", *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;//多边形mesh
tri->setTrianglePixelSize(size);//曲面重建的精细程度
tri->setInputCloud(rangeImage);//设置输入的深度图像
tri->setSearchMethod(tree);//设置搜索方法
tri->setTriangulationType((pcl::OrganizedFastMesh<pcl::PointWithRange>::TriangulationType)type);//设置三角化的类型
tri->reconstruct(triangles);//重建结果到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();
}
return 0;
}
具体怎么应用后面再补充。