注:本示例包含拼接两个字段相同的点云 + 拼接两个字段不同的点云。
1.拼接两个点云,生成新点云
1.1 作用
用于直接拼接两个数据段相同的点云数据,生成新点云。
1.2 代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/common/copy_point.h>
#include <pcl/common/file_io.h>
#include <pcl/common/io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
int main()
{
/****************拼接两个点云,生成新点云<io.h>********************/
// 点云A
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud0(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/bunny.pcd", *cloud0); // 加载原始点云数据
// 点云B
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/person4.pcd", *cloud1); // 加载原始点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>); // 结果点云
bool bCon = pcl::concatenate(*cloud0, *cloud1, *cloud2); // 连接两个点云,生成新点云(连接成功返回true,连接失败返回false)
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
view_raw->addPointCloud<pcl::PointXYZ>(cloud0, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud0, 0, 255, 0), "raw cloud");
view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view0(new pcl::visualization::PCLVisualizer("raw0"));
view0->addPointCloud<pcl::PointXYZ>(cloud1, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud1, 255, 0, 0), "raw0 cloud");
view0->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw0 cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view1(new pcl::visualization::PCLVisualizer("raw1"));
view1->addPointCloud<pcl::PointXYZ>(cloud2, "raw1 cloud");
view1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw1 cloud");
while (!view_raw->wasStopped() || !view0->wasStopped() || !view1->wasStopped())
{
view_raw->spinOnce(100);
view0->spinOnce(100);
view1->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
}
1.3 结果展示
原始点云A及原始点云B(展示时手动给点云添加了颜色,点云数据无颜色)
拼接后的结果点云
2.拼接两个字段不同的点云,生成包含全部字段的新点云
2.1 注意
(1)如果输入数据集有重叠的字段(即两者都包含相同的字段),则第二个点云中的数据将覆盖第一个点云中的数据。
(2)两点云数据需是相同点云,但只是包含的字段不同
如点云A、点云B都有10000个点,但点云A为PCL::PointXYZ型,点云B为PCL::PointRGB型,拼接结果为PCL::PointXYZRGB型。
2.2 代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/common/copy_point.h>
#include <pcl/common/file_io.h>
#include <pcl/common/io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
int main()
{
/****************拼接两个字段不同的点云,生成包含全部字段的新点云(如果输入数据集有重叠的字段(即两者都包含相同的字段),则第二个点云中的数据将覆盖第一个点云中的数据)<io.h>********************/
// 点云A
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud4(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/rabbit.pcd", *cloud4); // 不带RGB点云(RGB颜色为红色)
// 点云B
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud5(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile("D:/code/csdn/data/bunny.pcd", *cloud5); // 带有RGB的点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud6(new pcl::PointCloud<pcl::PointXYZRGB>); // 结果点云
pcl::concatenateFields(*cloud4, *cloud5, *cloud6); // 组合两个字段不同的点云,生成包含全部字段的新点云(如果输入数据集有重叠的字段(即两者都包含相同的字段),则第二个点云中的数据将覆盖第一个点云中的数据)
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> view2(new pcl::visualization::PCLVisualizer("raw"));
view2->addPointCloud<pcl::PointXYZ>(cloud4, "raw cloud");
view2->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view3(new pcl::visualization::PCLVisualizer("raw0"));
view3->addPointCloud<pcl::PointXYZRGB>(cloud5, "raw0 cloud");
view3->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw0 cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view4(new pcl::visualization::PCLVisualizer("raw1"));
view4->setBackgroundColor(255, 255, 255);
view4->addPointCloud<pcl::PointXYZRGB>(cloud6, "raw1 cloud");
view4->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw1 cloud");
while (!view2->wasStopped() || !view3->wasStopped() || !view4->wasStopped())
{
view2->spinOnce(100);
view3->spinOnce(100);
view4->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
}
2.3 结果展示
左为不带RGB的点云,右为带RGB的点云
拼接的结果为带RGB的点云