这个程序演示如何把深度映射为颜色从而以2D彩色图像方式可视化深度图。先看看输入数据是一个办公室的3D扫描pcl_viewer自带的是3D深度图,如下图所示。在这个3D深度图里距离相机越近颜色越接近红色距离相机越远颜色越接近蓝色。接下来看一下程序生成的2D深度图。在这个2D深度图里不可见区域距离为 -INFINITY显示为浅绿色矩形的四个角就是不可见区域。远距离区域距离为 INFINITY显示为浅蓝色这个就比较明显了。通过对比3D深度图和2D深度图可以看到距离相机越近颜色越接近黑色。输入任意点云 point_cloud.pcd输出没有保存输出结果运行编译后在cmd里运行参数是point_cloud.pcd。如果不带参数直接双击运行会使用代码生成的固定点云不会报错。代码#include iostream #include pcl/range_image/range_image.h #include pcl/io/pcd_io.h #include pcl/visualization/range_image_visualizer.h #include pcl/visualization/pcl_visualizer.h #include pcl/console/parse.h typedef pcl::PointXYZ PointType; // -------------------- // -----Parameters----- // -------------------- float angular_resolution_x 0.5f, angular_resolution_y angular_resolution_x; pcl::RangeImage::CoordinateFrame coordinate_frame pcl::RangeImage::CAMERA_FRAME; bool live_update false; // -------------- // -----Help----- // -------------- void printUsage (const char* progName) { std::cout \n\nUsage: progName [options] scene.pcd\n\n Options:\n -------------------------------------------\n -rx float angular resolution in degrees (default angular_resolution_x)\n -ry float angular resolution in degrees (default angular_resolution_y)\n -c int coordinate frame (default (int)coordinate_frame)\n -l live update - update the range image according to the selected view in the 3D viewer.\n -h this help\n \n\n; } void setViewerPose (pcl::visualization::PCLVisualizer viewer, const Eigen::Affine3f viewer_pose) { Eigen::Vector3f pos_vector viewer_pose * Eigen::Vector3f(0, 0, 0); Eigen::Vector3f look_at_vector viewer_pose.rotation () * Eigen::Vector3f(0, 0, 1) pos_vector; Eigen::Vector3f up_vector viewer_pose.rotation () * Eigen::Vector3f(0, -1, 0); viewer.setCameraPosition (pos_vector[0], pos_vector[1], pos_vector[2], look_at_vector[0], look_at_vector[1], look_at_vector[2], up_vector[0], up_vector[1], up_vector[2]); } // -------------- // -----Main----- // -------------- int main (int argc, char** argv) { // -------------------------------------- // -----Parse Command Line Arguments----- // -------------------------------------- if (pcl::console::find_argument (argc, argv, -h) 0) { printUsage (argv[0]); return 0; } if (pcl::console::find_argument (argc, argv, -l) 0) { live_update true; std::cout Live update is on.\n; } if (pcl::console::parse (argc, argv, -rx, angular_resolution_x) 0) std::cout Setting angular resolution in x-direction to angular_resolution_xdeg.\n; if (pcl::console::parse (argc, argv, -ry, angular_resolution_y) 0) std::cout Setting angular resolution in y-direction to angular_resolution_ydeg.\n; int tmp_coordinate_frame; if (pcl::console::parse (argc, argv, -c, tmp_coordinate_frame) 0) { coordinate_frame pcl::RangeImage::CoordinateFrame (tmp_coordinate_frame); std::cout Using coordinate frame (int)coordinate_frame.\n; } angular_resolution_x pcl::deg2rad (angular_resolution_x); angular_resolution_y pcl::deg2rad (angular_resolution_y); // ------------------------------------------------------------------ // -----Read pcd file or create example point cloud if not given----- // ------------------------------------------------------------------ pcl::PointCloudPointType::Ptr point_cloud_ptr (new pcl::PointCloudPointType); pcl::PointCloudPointType point_cloud *point_cloud_ptr; Eigen::Affine3f scene_sensor_pose (Eigen::Affine3f::Identity ()); std::vectorint pcd_filename_indices pcl::console::parse_file_extension_argument (argc, argv, pcd); if (!pcd_filename_indices.empty ()) { std::string filename argv[pcd_filename_indices[0]]; if (pcl::io::loadPCDFile (filename, point_cloud) -1) { std::cout Was not able to open file \filename\.\n; printUsage (argv[0]); return 0; } scene_sensor_pose Eigen::Affine3f (Eigen::Translation3f (point_cloud.sensor_origin_[0], point_cloud.sensor_origin_[1], point_cloud.sensor_origin_[2])) * Eigen::Affine3f (point_cloud.sensor_orientation_); } else { std::cout \nNo *.pcd file given Generating example point cloud.\n\n; for (float x-0.5f; x0.5f; x0.01f) { for (float y-0.5f; y0.5f; y0.01f) { PointType point; point.x x; point.y y; point.z 2.0f - y; point_cloud.push_back (point); } } point_cloud.width point_cloud.size (); point_cloud.height 1; } // ----------------------------------------------- // -----Create RangeImage from the PointCloud----- // ----------------------------------------------- float noise_level 0.0; float min_range 0.0f; int border_size 1; pcl::RangeImage::Ptr range_image_ptr(new pcl::RangeImage); pcl::RangeImage range_image *range_image_ptr; range_image.createFromPointCloud (point_cloud, angular_resolution_x, angular_resolution_y, pcl::deg2rad (360.0f), pcl::deg2rad (180.0f), scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size); // -------------------------------------------- // -----Open 3D viewer and add point cloud----- // -------------------------------------------- pcl::visualization::PCLVisualizer viewer (3D Viewer); viewer.setBackgroundColor (1, 1, 1); pcl::visualization::PointCloudColorHandlerCustompcl::PointWithRange range_image_color_handler (range_image_ptr, 0, 0, 0); viewer.addPointCloud (range_image_ptr, range_image_color_handler, range image); viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, range image); //viewer.addCoordinateSystem (1.0f, global); //PointCloudColorHandlerCustomPointType point_cloud_color_handler (point_cloud_ptr, 150, 150, 150); //viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, original point cloud); viewer.initCameraParameters (); setViewerPose(viewer, range_image.getTransformationToWorldSystem ()); // -------------------------- // -----Show range image----- // -------------------------- pcl::visualization::RangeImageVisualizer range_image_widget (Range image); range_image_widget.showRangeImage (range_image); //-------------------- // -----Main loop----- //-------------------- while (!viewer.wasStopped ()) { range_image_widget.spinOnce (); viewer.spinOnce (); pcl_sleep (0.01); if (live_update) { scene_sensor_pose viewer.getViewerPose(); range_image.createFromPointCloud (point_cloud, angular_resolution_x, angular_resolution_y, pcl::deg2rad (360.0f), pcl::deg2rad (180.0f), scene_sensor_pose, pcl::RangeImage::LASER_FRAME, noise_level, min_range, border_size); range_image_widget.showRangeImage (range_image); } } }参考How to visualize a range image — Point Cloud Library 0.0 documentation