可PCLVisualizer视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer 更为复杂,具有更全面的功能,如显示法线、点云着色、绘制多种形状和开辟多个视口。
点云素材:bunny.txt
1、按照点云坐标x、y、z坐标值中字段给点云进行赋值渲染
void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
pcl::visualization::PCLVisualizer viewer("cloud");
viewer.setBackgroundColor(0, 0, 0); // 设置背景色,RGB,0~1
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "x"); // 按照x字段进行渲染
viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample"); // 显示点云,其中fildColor为颜色显示
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
}
// // event loop
/ Each call to spinOnce gives the viewer time to process events, allowing it to be interactive.
// while (!viewer->wasStopped()) {
// viewer->spinOnce(100);
// boost::this_thread::sleep(boost::posix_time::microseconds (100000));
// }
2、给点云单独赋予某一颜色
void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
pcl::visualization::PCLVisualizer viewer("cloud");
viewer.setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> singleColor(cloud, 0,255,0); // 0-255,设置成绿色
viewer.addPointCloud<pcl::PointXYZ>(cloud, singleColor, "sample"); // 显示点云,其中fildColor为颜色显示
// viewer.addPointCloud<pcl::PointXYZ>(cloud, "sample");
// viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, 0,1,0, "sample");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
}
3、随机生成颜色
void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
pcl::visualization::PCLVisualizer viewer("cloud");
viewer.setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> RandomColor(cloud); // 随机给点云生成颜色
viewer.addPointCloud<pcl::PointXYZ>(cloud, RandomColor, "sample"); // 显示点云,其中fildColor为颜色显示
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
}
4、可视化彩色点云
void visualization(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud) {
pcl::visualization::PCLVisualizer viewer("cloud");
viewer.setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> fildColor(cloud);
viewer.addPointCloud<pcl::PointXYZRGB>(cloud, fildColor, "sample");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置点云大小
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
}
5、添加坐标系、箭头、相机视角
void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
pcl::visualization::PCLVisualizer viewer("cloud");
viewer.setBackgroundColor(0, 0, 0); // 设置背景色,RGB,0~1
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "x"); // 按照x字段进行渲染
viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample"); // 设置标签点云的大小
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.9, "sample"); // 设置标签点云的不透明度
viewer.addCoordinateSystem(0.05); // 添加坐标系,并设置比例
viewer.initCameraParameters(); // 通过设置照相机参数使得从默认的角度和方向观察点云
Eigen::Vector4f centroid;
pcl::compute3DCentroid(*cloud, centroid);
pcl::PointXYZ p1(centroid[0], centroid[1], centroid[2]);
pcl::PointXYZ p2(centroid[0], centroid[1] + 0.03, centroid[2]);
viewer.addArrow(p2, p1, 1, 0, 0, false); // 添加箭头
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
}
6、多视角显示(PCL visealizer可视化类允许用户通过不同的窗口(Viewport)绘制多个点云方便点云比较)
void visualization(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
pcl::visualization::PCLVisualizer viewer("cloud");
int v1(0); // 创建新的视角
viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1); // 4个参数分别是X轴的最小值,最大值,Y轴的最小值,最大值,取值0-1,v1是标识
viewer.setBackgroundColor(0, 0, 0, v1); // 设置视口的背景颜色
viewer.addText("x colored cloud", 10, 10, "v1 text", v1); // 添加文本
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "x");
viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "v1 cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "v1 cloud");
// 对第二视口做同样的操作,使得做创建的点云分布于右半窗口,将该视口背景赋值于灰色,以便明显区别,虽然添加同样的点云,给点云自定义颜色着色
int v2(0);
viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);
viewer.setBackgroundColor (0.3, 0.3, 0.3, v2);
viewer.addText("green cloud", 10, 10, "v2 text", v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> singleColor(cloud, 0, 255, 0);
viewer.addPointCloud<pcl::PointXYZ>(cloud, singleColor, "v2 cloud", v2);
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "v2 cloud");
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
}
主函数
#include <pcl/common/centroid.h>
#include <pcl/visualization/pcl_visualizer.h>
void CreateCloudFromTxt(const std::string& file_path,
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
std::ifstream fin(file_path.c_str());
std::string line;
pcl::PointXYZ point;
while (getline(fin, line)) {
std::stringstream ss(line);
ss >> point.x;
ss >> point.y;
ss >> point.z;
cloud->push_back(point);
}
fin.close();
}
int main(int argc, char**argv) {
// 加载点云模型
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
CreateCloudFromTxt("/tmp/bunny.txt", cloud);
// 点云渲染和可视化
visualization(cloud);
return 0;
}
在使用PCL点云库进行可视化的时候,可以通过键盘控制显示情况,在可视化窗口按h
键可以查看。
参考:
http://www.pclcn.org/study/news.php?lang=cn&class1=85&class2=102&class3=105&page=4