本小节讲解如何可视化深度图像的两种方法,在3D视窗中以点云形式进行可视化(深度图像来源于点云),另一种是,将深度值映射为颜色,从而以彩色图像方式可视化深度图像。
代码
首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第7章例2文件夹中,打开名为range_image_visualization.cpp的代码文件,同文件夹下可以找到相关的测试点云文件room_scan1.pcd。
解释说明
首先,解析命令行并从磁盘上读取点云(如果没有点云文件,自行创建一个),并构造深度图像。
pcl::visualization::PCLVisualizer viewer ("3D Viewer"); //定义初始化可视化对象
viewer.setBackgroundColor (1, 1, 1); //设置背景为白色
pcl::visualization::PointCloudColorHandlerCustom 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);
//pcl::visualization::PointCloudColorHandlerCustom 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 ());
这段代码创建了3D视窗对象,将背景颜色设置为白色,添加黑色的、点云大小为1的深度图像(点云),并使用main函数上面定义的setViewerPose函数设置深度图像的视点参数。上面程序中被注释的部分用于添加坐标系,并对原始点云进行可视化,下面的程序用于以图像显示的方式可视化深度图像,图像颜色取决于深度值。
pcl::visualization::RangeImageVisualizer range_image_widget (“Range image”);
range_image_widget.setRangeImage (range_image); //图像可视化方式显示深度图像
现在,我们可以启动主循环以保证可视化代码的有效性,直到可视化窗口关闭才结束该循环。
while (!viewer.wasStopped ())
{
range_image_widget.spinOnce ();
viewer.spinOnce ();
pcl_sleep (0.01);
range_image_widget.spinOnce()处理深度图像可视化类的当前事件,viewer.spinOnce()处理3D窗口的当前事件,此外,还可以随时更新2D深度图像,以响应可视化窗口中的当前视角,这通过命令行的参数-l来激活。
if (live_update)
{
scene_sensor_pose =viewer.getViewerPose();
range_image.createFromPointCloud (point_cloud, angular_resolution, pcl::deg2rad (360.0f), pcl::deg2rad (180.0f),scene_sensor_pose, pcl::RangeImage::LASER_FRAME, noise_level, min_range, border_size);
range_image_widget.setRangeImage (range_image);
}
}
在这里,我们首先从视窗中得到当前的观察位置,然后创建对应视角的深度图像,并在图像显示插件中进行显示。
编译并运行程序
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
…>range_image_visualization.exe
这一步将使用自动生成的矩形空间点云。在此,打开两个窗口,一个是点云的3D可视化窗口,另一个是深度图像的可视化窗口,在该窗口图像的颜色由深度决定。用户可使用自己硬盘中的点云数据进行可视化测试。
…>range_image_visualization
用户也可尝试使用-l参数,根据当前的视角更新深度图像
1
…>range_image_visualization -l
运行结果类似,如图1所示为深度图像点云可视化,2为深度图像图像可视化窗口,图中,不可视区域(范围无穷远)用浅绿色表示,远距离区域(范围无穷远,激光扫描时可获取信息)用淡蓝色表示,注意两者虽然都是无穷远,但前者是在激光扫描不可见区域,后者是在可见区域的无穷远。
图1 深度图像可视化运行结果
图2 深度图像可视化实例运行结果