版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/misayaaaaa/article/details/83990197
PCLVisualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer使用起来更为复杂,但该类具有更全面的功能,如显示法线、绘制多种形状和多个视口。
我们先从官方文档及源码看起:
http://docs.pointclouds.org/1.8.1/classpcl_1_1visualization_1_1_cloud_viewer.html
http://docs.pointclouds.org/1.8.1/classpcl_1_1visualization_1_1_p_c_l_visualizer.html
对于CloudViewer类来说,其方法有大致以下几类(驼峰规则让源码看起来很舒服)
void showCloud()
void wasStopped()
void runOnVisualizationThread()
void runOnVisualizationThreadOnce ()
void removeVisualizationCallable()
boost::signals2::connection registerKeyboardCallback()
boost::signals2::connection registerMouseCallback()
boost::signals2::connection registerPointPickingCallback()
从名字中可以大致看出函数的意义:显示点云、关闭窗口、键盘鼠标的响应。
void runOnVisualizationThread()
void runOnVisualizationThreadOnce ()
这两个函数和PCLVisualizer关联较大,一起使用更加甜蜜。
他们的可以在函数中调用一个对象,在界面中画出想要的东西,但可能是只运行一次的或者一直运行的。
//只会执行一次
void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
//设置背景颜色
viewer.setBackgroundColor (0.0, 0.0, 0.0);
//球体坐标
// pcl::PointXYZ o;
// o.x = 0;
// o.y = 0;
// o.z = 0;
////添加球体
// viewer.addSphere (o, 1, "sphere", 0);
// std::cout << "i only run once" << std::endl;
}
//一直会执行下去,直到窗口关闭
void viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++;
viewer.removeShape ("text", 0);
viewer.addText (ss.str(), 200, 300, "text", 0);
//viewer.addCoordinateSystem (1.0,0,0,0);
//FIXME: possible race condition here:
// user_data++;
}
void OpenOfflineOutputFile::open3DPointCloudFile(std::string& filepath)
{
pcl::PointCloud<pcl::PointXYZI>::Ptr m_cloud(new pcl::PointCloud<pcl::PointXYZI>);
pcl::io::loadPCDFile(filepath,*m_cloud);
pcl::visualization::CloudViewer viewer("3D Point Cloud Viewer");
viewer.showCloud(m_cloud);
viewer.runOnVisualizationThreadOnce (viewerOneOff);//调用相应函数执行
viewer.runOnVisualizationThread (viewerPsycho);//调用相应函数执行
while(!viewer.wasStopped())
{
}
}
从上即可看出,PCLVisualizer的强大之处,可以改变窗口背景,还可以添加球体,设置文本,功能特别丰富。
由于PCLVisualizer中功能甘薯太多,这里就不一一列举了,大家可以按需自行查阅。这里仅提供一个PCL中一个小方法:CloudViewer不能完成的界面功能可以使用PCLVisualizer。