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

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

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将不同字段点云数据进行拼接,可以使用`pcl::concatenateFields()`函数。这个函数可以将多个点云数据集按照相同的点数和点序列组合成一个新的点云数据集。下面是一个示例代码: ```cpp #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/concatenate.h> int main(int argc, char** argv) { // 读取两个点云文件 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZRGB>); pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); pcl::io::loadPCDFile("cloud1.pcd", *cloud1); pcl::io::loadPCDFile("normals.pcd", *normals); // 合并两个点云数据集 pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>); pcl::concatenateFields(*cloud1, *normals, *cloud_with_normals); // 将合并后的点云数据集拆分成两个点云数据集 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZRGB>); pcl::PointCloud<pcl::Normal>::Ptr normals2(new pcl::PointCloud<pcl::Normal>); pcl::copyPointCloud(*cloud_with_normals, *cloud2); pcl::copyPointCloud(*cloud_with_normals, *normals2); return 0; } ``` 这个例子中,我们首先读取了两个点云文件,一个包含XYZRGB信息,另一个包含法线信息。然后使用`pcl::concatenateFields()`函数将这两个点云数据集合并成一个包含了XYZRGB和法线信息的点云数据集。最后使用`pcl::copyPointCloud()`函数将合并后的点云数据集拆分成两个点云数据集,一个包含XYZRGB信息,另一个包含法线信息。 需要注意的是,调用`pcl::copyPointCloud()`函数时,第一个参数是原始点云数据集,第二个参数是要拆分出来的目标点云数据集,所以在拆分时需要分别为XYZRGB和法线信息创建两个目标点云数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值