【学习笔记二】关于点云的拼接说明

1、点云的拼接分类

  • 点云的拼接有两种,
  • 一种是直接两个点云的点连接起来。A+B=C
  • 另一种则是将点云的字段连接起来,这种气情况下要求两个点云的点的数目必须要是一样的,比如说N个点云A的xyz点和N个点云B的rgb点,连接起来就是xyzrgb的N个点云C。

在这里可以参考一下另一位大佬的说明,大佬的点云拼接说明
接下来我给的是我的改动之下的理解。

2、点云拼接示例

在这里,先对大佬,其实也就是官方示例中的strcmp函数解释一下,因为这个函数是用来比较字符串的函数,并返回一个整数。
在这里插入图片描述
例如,
strcmp(str1,str2)
当str1=str2时,会返回0;
当str1<str2时,会返回负数;
当str1>str2时,会返回正数;

然后int argc是用来储存程序本身有几个变量,一般都是一个;
而指针argv[0]指向程序本身地址,也就是XXX.exe;
你可以在程序里下面这句代码显示出来本程序的地址

cout<<argv[0]<<endl;

这这里,原本的程序示例中,人为添加了两个变量,也就是’-p’还有’-f’;
这个添加方法就是通过命令行(CMD窗口)直接打开程序,快捷键是win+R;如图所示,
通过自己添加一个变量-p,来达到选择判断的效果。原程序的判断方法就是-p和-f两个变量。
在这里插入图片描述

如果你没有看懂的话,可以来看看我这个改进版本的选择,通过while循环和switch达到的选择效果。

#include "stdafx.h"
#include <iostream> //标准输入输出流
#include <pcl/io/pcd_io.h> //PCL的PCD格式文件的输入输出头文件
#include <pcl/point_types.h> //PCL对各种格式的点的支持头文件

using namespace std;

// 程序拼接A和B到C
int main(int argc, char** argv)
{

	// 用于拼接不同点云的点的变量
	pcl::PointCloud<pcl::PointXYZ> cloud_a, cloud_b, cloud_c; //创建点云(不是指针),存储点坐标xyz
															  // 用于拼接不同点云的域(点和法向量)的变量
	pcl::PointCloud<pcl::Normal> n_cloud_b; //创建点云,储存法向量
	pcl::PointCloud<pcl::PointNormal> p_n_cloud_c; //创建点云,储存点坐标和法向量


	cloud_a.width = 5; //设置宽度
	cloud_a.height = cloud_b.height = n_cloud_b.height = 1; //设置高度
	cloud_a.points.resize(cloud_a.width * cloud_a.height); //变形,无序

	//给点云A赋值,填充点云数据
	for (size_t i = 0; i < cloud_a.points.size(); ++i) //设置cloud_a中点的坐标(随机数)
	{
		cloud_a.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
		cloud_a.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
		cloud_a.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
	}

	//设置一个循环
	cout << "请输入你想要的操作,输入数字12,退出请按q键" << endl;
	cout << "1-连接点云(不同点云的点)  2-拼接点云(不同点云的域,比如点和法向量)  q-退出程序" << endl;
	char ch;
	while(cin>>ch)
		switch (ch)
		{
		case '1':
			cloud_b.width = 3; //cloud_b用于拼接不同点云的点
			cloud_b.points.resize(cloud_b.width * cloud_b.height);
            //设置cloud_b中点的坐标(随机数)
			for (size_t i = 0; i < cloud_b.points.size(); ++i) 
			{
				cloud_b.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
				cloud_b.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
				cloud_b.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
			}
			std::cerr << "Cloud A: " << std::endl;
            //打印cloud_a的点坐标信息
			for (size_t i = 0; i < cloud_a.points.size(); ++i) 
				std::cerr << "    " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl;
            //打印Cloud B
			std::cerr << "Cloud B: " << std::endl; 
			for (size_t i = 0; i < cloud_b.points.size(); ++i)
					std::cerr << "    " << cloud_b.points[i].x << " " << cloud_b.points[i].y << " " << cloud_b.points[i].z << std::endl;
			//开始拼接并打印点云
				cloud_c = cloud_a;
				cloud_c += cloud_b; // cloud_a + cloud_b 意思是cloud_c包含了a和b中的点,c的点数 = a的点数+b的点数
				std::cerr << "Cloud C: " << std::endl; 打印Cloud C
				for (size_t i = 0; i < cloud_c.points.size(); ++i) //打印Cloud C
					std::cerr << "    " << cloud_c.points[i].x << " " << cloud_c.points[i].y << " " << cloud_c.points[i].z << " " << std::endl;
			break;

		case '2':
			n_cloud_b.width = 5; //n_cloud_b用于拼接不同点云的域
			n_cloud_b.points.resize(n_cloud_b.width * n_cloud_b.height);
			for (size_t i = 0; i < n_cloud_b.points.size(); ++i) //设置n_cloud_b中点的坐标(随机数)
			{
				n_cloud_b.points[i].normal[0] = 1024 * rand() / (RAND_MAX + 1.0f);
				n_cloud_b.points[i].normal[1] = 1024 * rand() / (RAND_MAX + 1.0f);
				n_cloud_b.points[i].normal[2] = 1024 * rand() / (RAND_MAX + 1.0f);
			}
			//打印cloud_a的点坐标信息
			for (size_t i = 0; i < cloud_a.points.size(); ++i)
				std::cerr << "    " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl;
			//打印Cloud B
			std::cerr << "Cloud B: " << std::endl;
			for (size_t i = 0; i < n_cloud_b.points.size(); ++i)
				std::cerr << "    " << n_cloud_b.points[i].normal[0] << " " << n_cloud_b.points[i].normal[1] << " " << n_cloud_b.points[i].normal[2] << std::endl;
			//开始拼接并打印点云
			pcl::concatenateFields(cloud_a, n_cloud_b, p_n_cloud_c); //拼接(点)cloud_a和(法向量)n_cloud_b到p_n_cloud_c
			std::cerr << "Cloud C: " << std::endl;
			for (size_t i = 0; i < p_n_cloud_c.points.size(); ++i) //打印Cloud C
				std::cerr << "    " <<
				p_n_cloud_c.points[i].x << " " << p_n_cloud_c.points[i].y << " " << p_n_cloud_c.points[i].z << " " <<
				p_n_cloud_c.points[i].normal[0] << " " << p_n_cloud_c.points[i].normal[1] << " " << p_n_cloud_c.points[i].normal[2] << std::endl;

			break;


		case 'q':

			return(1);


		default:
			cout << "请重新输入:" << endl;
		}

	return (0);
}

效果图
在这里插入图片描述

在这里插入图片描述

点云拼接到此结束!

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
拼接是一种将多个离散的点数据集合并成一个完整的三维点模型的技术。而g2o图优化则是一种用于SLAM(Simultaneous Localization and Mapping)的图优化库。SLAM是一种同时进行自主定位和地图构建的技术,而g2o库则提供了实现SLAM中图优化所需的功能。通过g2o图优化,可以优化相机位姿、特征点的位置以及地图点的位置等参数,以提高SLAM系统的精度和鲁棒性。在点拼接中,使用g2o图优化可以优化不同点之间的相对位姿,从而更好地拼接数据,减少配准误差,得到更准确的点模型。所以,g2o图优化在点拼接中起到了优化相机位姿和配准结果的作用,提高了点拼接的质量和准确性。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [视觉SLAM笔记(29) g2o](https://blog.csdn.net/qq_32618327/article/details/102403457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [slam.rar_G2O_点特征_点特征提取_视觉SLAM_视觉SLAM十四讲](https://download.csdn.net/download/weixin_42662293/86207140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [使用g2o进行静态建图时所遇问题及解决方法](https://blog.csdn.net/qq_38815760/article/details/120812996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福尔摩司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值