PCL 拼接点云【拼接两个字段相同的点云 + 拼接两个字段不同的点云】(Common_IO)

PCL专栏目录及须知-优快云博客

注:本示例包含拼接两个字段相同的点云 + 拼接两个字段不同的点云。

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的点云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值