爲了更加直觀的顯示點雲、使點雲在視窗中比較容易區分,這裏介紹幾種PCLVisualizer可視化類的使用方法。
顯示點雲顏色特徵
該方法(PointCloudColorHandlerRGBField)要求點雲類型包含RGB三個顏色分量,即該方法是直接顯示點雲中各個點的RGB屬性字段信息,而不是通過對點雲着色顯示不同顏色。
- 代碼
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace std;
using namespace pcl;
using namespace io;
int main() {
PointCloud<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>);
if (io::loadPLYFile("bunny_rgb.ply", *cloud) == -1) { // 讀取.ply文件
cerr << "can't read file bunny.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 設置點雲大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
- 結果
自定義點雲顏色特徵
該方法(PointCloudColorHandlerCustom)適用於任何格式點雲,不要求點雲類型包含RGB三個顏色分量,即將id爲"sample cloud"的點雲作爲一個整體進行着色。
- 代碼
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace std;
using namespace pcl;
using namespace io;
int main() {
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 讀取.ply文件
cerr << "can't read file bunny.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0); // green
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
//viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "sample cloud");// 也可以
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
- 結果
以顏色區別深度
該方法(PointCloudColorHandlerGenericField)將不同的深度值顯示爲不同的顏色,實現以顏色區分深度的目的;方法PointCloudColorHandlerCustom是將點雲作爲整體並統一着色,PointCloudColorHandlerGenericField方法是將點雲按深度值(“x”、“y”、"z"均可)的差異着以不同的顏色。
- 代碼
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace std;
using namespace pcl;
using namespace io;
int main() {
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 讀取.ply文件
cerr << "can't read file bunny.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z"); // 按照z字段進行渲染
viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 設置點雲大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
- 結果
備註:
- 點雲源文件"bunny.ply"見:PCL+VS2015實現點雲可視化;另外,"bunny_rgb.ply"爲遍歷"bunny.ply"中所有點並依此着色得到。
- 上述方法並不會修改點雲的RGB屬性字段,而只是對顯示進行渲染的結果。
- 參考:官網教程:PCLVisualizer可視化類。