pcl教程笔记(二)点云显示与线程

PCL官方教程提供了一份点云显示的文档教程。
点云显示与主线程不相关,是一个单独的线程。所以如果在主线程中对点云进行操作,很有可能会发生线程争用的问题。

viewer.runOnVisualizationThreadOnce()和viewer.runOnVisualizationThread ()可以用于点云显示线程,避免部分问题。

此外还可以使用mutex线程互锁
https://www.cnblogs.com/Asp1rant/p/12420769.html
其中join和detach的区别较大。
detach的线程即使主线程结束,该孤儿线程也不会立即结束,所以如果主线程没有在孤儿线程之后结束,通常会报错,但会继续运行,直到孤儿线程结束。

#include 
#include 
#include 
#include 
    
int user_data;
    
void 
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor (1.0, 0.5, 1.0);
    pcl::PointXYZ o;
    o.x = 1.0;
    o.y = 0;
    o.z = 0;
    viewer.addSphere (o, 0.25, "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);
    
    //FIXME: possible race condition here:
    user_data++;
}
    
int 
main ()
{
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud);
    
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    
    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);
    
    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer
    
    //This will only get called once
    viewer.runOnVisualizationThreadOnce (viewerOneOff);
    
    //This will get called once per visualization iteration
    viewer.runOnVisualizationThread (viewerPsycho);
    while (!viewer.wasStopped ())
    {
    //you can also do cool processing here
    //FIXME: Note that this is running in a separate thread from viewerPsycho
    //and you should guard against race conditions yourself...
    user_data++;
    }
    return 0;
}

你可能感兴趣的:(图像处理,激光雷达)