我刚刚开始使用优秀的点云库,想要在一个观看者中显示两个点云,但每个点都有不同的颜色。
当我使用一个点云对象(指针?!)时,它工作正常,但如果我想添加第二个,则只有第二个将显示在查看器中。
我正在使用pcl 1.6版,并且非常喜欢这个tutorial 也许你们有一个建议。
相关的代码段如下。在此先感谢!!!
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_two_clouds (new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer_two_clouds->setBackgroundColor(0,0,0);
// cloud: green / cloud2: red
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color1 (cloud, 0, 255, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color2 (cloud2, 255, 0, 0);
//add both
viewer_two_clouds->addPointCloud<pcl::PointXYZRGB> (cloud, single_color1, "sample_cloud_1");
viewer_two_clouds->addPointCloud<pcl::PointXYZRGB> (cloud2, single_color2, "sample_cloud_2");
// set coordinateSystem and init camera
viewer_two_clouds->addCoordinateSystem(1.0);
viewer_two_clouds->initCameraParameters();
while(!viewer_two_clouds->wasStopped())
{
viewer_two_clouds->spinOnce();
boost::this_thread::sleep (boost::posix_time::microseconds(100000));
}
viewer_two_clouds->close();
答案 0 :(得分:8)
为了将转换(例如旋转和平移)应用于已加载的点云,您应该使用pcl::transformPointCloud
函数(see here)。此函数有3个参数:输入云,输出云和Eigen::Transform
。只需定义翻译转换并将其提供给函数,即可正确转换云。
有一个很好的Eigen教程(here),向您展示如何定义和使用空间变换。
答案 1 :(得分:3)
德克斯特帮助我很多=)
以下是我用来转换Pointcloud的内容,以便其他人也可以使用它!
void trans ();
{
Eigen::Affine3f t;
pcl::getTransformation(10.0,5.0,20.0,0.0,0.0,0.0,t);
pcl::transformPointCloud(*cloud, *cloud2, t);
}
答案 2 :(得分:3)
还有其他方法可以在一个查看器中显示两个点云。您可以在窗口上创建两个不同的视口,有些人会这样想:
viewer_two_clouds->createViewPort (0.0,0.0,0.5,1.0,0);
viewer_two_clouds->setBackgroundColor(0,0,0,0); // background color dark
viewer_two_clouds->addText("sample_cloud_1", 10, 10, "right", 0);
viewer_two_clouds->addPointCloud(cloud, "sample_cloud_1", 0);
viewer_two_clouds->createViewPort (0.5,0.0,0.1,1.0,0);
viewer_two_clouds->setBackgroundColor(0.1,0.1,0.1,0); // background color light
viewer_two_clouds->addText("sample_cloud_2", 10, 10, "left", 0);
viewer_two_clouds->addPointCloud(cloud2, "sample_cloud_2", 0);
用这种方式,你可以看到彼此之间的两个点云(并且没有重叠)。