点云旋转(基于PCL)

实现代码为:

//以中心化点进行旋转
	double theta = atan(maindirection.a);//计算的是弧度单位
	for (int i = 0; i < origipts.size(); i++)
	{
		pcl::PointXYZ tempone;
		tempone.x = aftercenerlizepts[i].x*cos(theta) + aftercenerlizepts[i].y*sin(theta) + center.x;
		tempone.y = aftercenerlizepts[i].y*cos(theta) - aftercenerlizepts[i].x*sin(theta) + center.y;
		transpts.push_back(tempone);
	}

3、测试结果

本程序是在PCL环境下运行,测试工程需要先配置好PCL环境,将点云旋转_test.cpp添加到源文件中即可运行。

3.1 轮廓点检测结果

轮廓点提取主函数如下:

//(1)测试边缘点提取结果
void main()
{
	char *filepath = "D:\\testdata\\points.xyz";
	char *savepath = "D:\\testdata\\points_boundpts.xyz";

	vector<pcl::PointXYZ> origipts = ReadPointXYZIntoVector(filepath);
	//假设其z坐标都为0,为平面坐标
	for (int i = 0; i < origipts.size(); i++)
	{
		origipts[i].z = 0;
	}
	
	vector<pcl::PointXYZ> boundpts, nonbounpts;
	double r = 0.8;
	Bounpts(origipts, r, boundpts, nonbounpts);



	ofstream outfile(savepath, ios::out);
	for (int j = 0; j < boundpts.size(); j++)
	{
		outfile << fixed << setprecision(3) << boundpts[j].x << " " << boundpts[j].y << " " << boundpts[j].z << " " << fixed << setprecision(0) << 255 << " " << 0 << " " << 0 << endl;
	}
	for (int j = 0; j < nonbounpts.size(); j++)
	{
		outfile << fixed << setprecision(3) << nonbounpts[j].x << " " << nonbounpts[j].y << " " << nonbounpts[j].z << " " << fixed << setprecision(0) << 255 << " " << 255 << " " << 255 << endl;
	}
	outfile.close();
	cout << "结束" << endl;
	pcl::visualization::PCLVisualizer viewer("点云可视化");
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr new_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	new_cloud->width = origipts.size();
	new_cloud->height = 1;
	new_cloud->is_dense = false;
	new_cloud->points.resize(new_cloud->width*new_cloud->height);


	for (int i = 0; i < origipts.size(); i++)
	{
		if (i < boundpts.size())
		{
			new_cloud->points[i].x = boundpts[i].x;
			new_cloud->points[i].y = boundpts[i].y;
			new_cloud->points[i].z = boundpts[i].z;
			new_cloud->points[i].r = 255;
			new_cloud->points[i].g = 0;
			new_cloud->points[i].b = 0;
		}
		else
		{
			new_cloud->points[i].x = nonbounpts[i - boundpts.size()].x;
			new_cloud->points[i].y = nonbounpts[i - boundpts.size()].y;
			new_cloud->points[i].z = nonbounpts[i - boundpts.size()].z;
			new_cloud->points[i].r = 255;
			new_cloud->points[i].g = 255;
			new_cloud->points[i].b = 255;
		}
	}

	pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>fildColor(new_cloud);
	viewer.setBackgroundColor(0, 0, 0);
	viewer.addPointCloud<pcl::PointXYZRGB>(new_cloud, fildColor, "inCloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "inCloud");
	while (!viewer.wasStopped())
	{
		viewer.spinOnce();
	}

	system("pause");

}

红色点为边缘点,可以看到边缘提取效果比较理想。

3.2 轮廓点分组

轮廓点分组测试结果如下:

//(2)测试边缘点分组
void main()
{
	char *filepath = "D:\\testdata\\points.xyz";
	char *savepath = "D:\\testdata\\points_boundpts_group.xyz";

	vector<pcl::PointXYZ> origipts = ReadPointXYZIntoVector(filepath);
	//假设其z坐标都为0,为平面坐标
	for (int i = 0; i < origipts.size(); i++)
	{
		origipts[i].z = 0;
	}

	vector<pcl::PointXYZ> boundpts, nonbounpts;
	double r = 0.8;
	Bounpts(origipts, r, boundpts, nonbounpts);

	vector<vector<pcl::PointXYZ>> multi_linepoints;
	double ds_thres = 0.35;
	double linefit_knn = 5;
	double growing_knn = 5;
	GroupPts(boundpts, ds_thres, linefit_knn, growing_knn, multi_linepoints);
	srand((int)time(0));
	ofstream outfile(savepath, ios::out);
	for (int i = 0; i < multi_linepoints.size(); i++)
	{
		double R = rand() % 255;
		double G = rand() % 255;
		double B = rand() % 255;
		for (int j = 0; j < multi_linepoints[i].size(); j++)
		{
			outfile << fixed << setprecision(3) << multi_linepoints[i][j].x << " " << multi_linepoints[i][j].y << " " << multi_linepoints[i][j].z << " " << fixed << setprecision(0) << R << " " << G << " " << B << endl;
		}
		
	}
	outfile.close();
	cout << "结束" << endl;
	pcl::visualization::PCLVisualizer viewer("点云可视化");
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr new_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	new_cloud->width = origipts.size();
	new_cloud->height = 1;
	new_cloud->is_dense = false;
	new_cloud->points.resize(new_cloud->width*new_cloud->height);

	
	
	int sumid = 0;
	for (int i = 0; i < multi_linepoints.size(); i++)
	{
		double R = rand() % 255;
		double G = rand() % 255;
		double B = rand() % 255;

		for (int j = 0; j < multi_linepoints[i].size(); j++)
		{
			new_cloud->points[sumid].x = multi_linepoints[i][j].x;
			new_cloud->points[sumid].y = multi_linepoints[i][j].y;
			new_cloud->points[sumid].z = multi_linepoints[i][j].z;
			new_cloud->points[sumid].r = R;
			new_cloud->points[sumid].g = G;
			new_cloud->points[sumid].b = B;
			sumid = sumid + 1;
		}

	}
	


	pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>fildColor(new_cloud);
	viewer.setBackgroundColor(0, 0, 0);
	viewer.addPointCloud<pcl::PointXYZRGB>(new_cloud, fildColor, "inCloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "inCloud");
	while (!viewer.wasStopped())
	{
		viewer.spinOnce();
	}

	system("pause");

}

属于同一直线的轮廓点,分组结果如上,结果比较理想。

3.3 点云旋转

//(3)原始点云进行旋转
void main()
{
	char *filepath = "D:\\testdata\\points.xyz";
	char *savepath = "D:\\testdata\\points_boundpts_transformpt.xyz";

	vector<pcl::PointXYZ> origipts = ReadPointXYZIntoVector(filepath);
	//假设其z坐标都为0,为平面坐标
	for (int i = 0; i < origipts.size(); i++)
	{
		origipts[i].z = 0;
	}

	vector<pcl::PointXYZ> boundpts, nonbounpts;
	double r = 0.8;
	Bounpts(origipts, r, boundpts, nonbounpts);

	pcl::PointXYZ center; 
	vector<pcl::PointXYZ> transpts;
	double ds_thres = 0.35;
	double linefit_knn = 5;
	double growing_knn = 5;
	TransformPts(origipts, r, ds_thres, linefit_knn, growing_knn, center, transpts);
	srand((int)time(0));
	ofstream outfile(savepath, ios::out);
	for (int i = 0; i < transpts.size(); i++)
	{		
		outfile << fixed << setprecision(3) << transpts[i].x << " " << transpts[i].y << " " << transpts[i].z << " " << endl;
	}
	outfile.close();
	cout << "结束" << endl;
	pcl::visualization::PCLVisualizer viewer("点云可视化");
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr new_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	new_cloud->width = origipts.size();
	new_cloud->height = 1;
	new_cloud->is_dense = false;
	new_cloud->points.resize(new_cloud->width*new_cloud->height);

	int sumid = 0;
	for (int i = 0; i < transpts.size(); i++)
	{
		new_cloud->points[sumid].x = transpts[i].x;
		new_cloud->points[sumid].y = transpts[i].y;
		new_cloud->points[sumid].z = transpts[i].z;
		new_cloud->points[sumid].r = 255;
		new_cloud->points[sumid].g = 255;
		new_cloud->points[sumid].b = 255;
	}

	pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>fildColor(new_cloud);
	viewer.setBackgroundColor(0, 0, 0);
	viewer.addPointCloud<pcl::PointXYZRGB>(new_cloud, fildColor, "inCloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "inCloud");
	while (!viewer.wasStopped())
	{
		viewer.spinOnce();
	}

	system("pause");

}

旋转前点云与水平方向存在一定旋转角,旋转后点云水平一致,旋转旋转成功。

代码与测试数据下载链接:https://mp.csdn.net/mp_download/manage/download/UpDetailed

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/387000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

【Zigbee课程设计系列文章】Zigbee开发环境搭建

【Zigbee课程设计系列文章】Zigbee开发环境搭建 前言IAR 下载安装Z-Stack协议栈安装 &#x1f38a;项目专栏&#xff1a;【Zigbee课程设计系列文章】&#xff08;附详细使用教程完整代码原理图完整课设报告&#xff09; 前言 &#x1f451;由于无线传感器网络&#xff08;也即…

RMSNorm原理及代码

RMSNorm原理及代码 在大模型中使用层归一化有如下几个因素&#xff1a; 改善网络稳定性加速收敛速度提高模型的泛化能力 批量归一化是对一个批次内的数据进行归一化 层归一化是对一个样本中的不同特征进行归一化 如下是LayerNorm与RMSNorm的公式 在LLaMA中使用RMSNorm替代…

【华为云】容灾方案两地三中心实践理论

应用上云之后&#xff0c;如何进行数据可靠性以及业务连续性的保障是非常关键的&#xff0c;通过华为云云上两地三中心方案了解相关方案认证地址&#xff1a;https://connect.huaweicloud.com/courses/learn/course-v1:HuaweiXCBUCNXI057Self-paced/about当前内容为灾备常见理论…

NARF关键点提取原理简介

一、NARF2D边缘点探测的矩形平面的边长s和计算点p和上邻域的距离所用的k值 二、障碍物边缘和阴影边缘 三、NARF边缘点探测 四、NARF借助边缘点信息进行关键点检测 本人也是参考其他博主&#xff0c;以及这份英文文献写的(毕竟是英文文献&#xff0c;部分翻译肯定有些误差&…

企业计算机服务器中了mkp勒索病毒怎么办?Mkp勒索病毒解密处理

随着网络技术的不断发展&#xff0c;企业的生产运营也加大了步伐&#xff0c;网络为企业的生产运营提供了强有力保障&#xff0c;但网络是一把双刃剑&#xff0c;给企业带来便利的同时也为企业带来了严重的数据威胁。春节期间&#xff0c;云天数据恢复中心接到很多企业的值班人…

反序列化漏洞(一)Shiro漏洞CVE-2016-4437复现

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、前言 春节后第一篇&#xff0c;祝大家龙年一切顺利&…

MySQL-运维

一、日志 1.错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysql启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关性息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&#xf…

国产制造,欧美品质:爱可声助听器产品质量获国际认可

随着科技的发展和全球化的推进&#xff0c;越来越多的中国制造产品开始走向世界舞台。其中&#xff0c;爱可声助听器凭借其卓越的产品质量&#xff0c;成为了国产制造的骄傲。 国产制造指的是在中国境内生产的产品&#xff0c;欧美品质则是指产品在设计、生产、质量控制等方面…

CSS3学习(一)

1. 语法规范 CSS主要由选择器和一条或多条的声明构成。 选择器用于指定CSS样式的HTML标签&#xff0c;花括号里面是对应的具体样式 属性与属性值以键值对的形式出现&#xff0c;属性与属性之间用分号隔开 <head>里写<style> 2. 基础选择器 【作用】选择标签使…

【计算机网络】FTP 文件传输协议

同样使用TCP 但使用了两个并行的TCP 控制链接 control connection 带外 out-of-band 传送的数据链接 data connection 对于FTP而言&#xff0c;控制链接贯穿了整个用户会话期间&#xff0c;数据链接每传输一个文件就有一次建立FTP是有状态&#xff08;state&#xff09;的&…

【从Python基础到深度学习】4. Linux常用命令(进阶)

接上篇 【从Python基础到深度学习】4. Linux 常用命令-CSDN博客 1.文件查找 - find 命令 find [搜索路径] [搜索条件] [操作]1.1 常用选项和参数 -name&#xff1a;按文件名搜索。 find 命令的 -name 选项可以接受通配符来匹配文件名。通配符可以帮助你更灵活地搜索文件名&a…

【Web】NSSCTF Round#18 Basic个人wp(部分)

目录 ①门酱想玩什么呢&#xff1f; ②Becomeroot ①门酱想玩什么呢&#xff1f; 先试一下随便给个链接 不能访问远程链接&#xff0c;结合评论区功能&#xff0c;不难联想到xss&#xff0c;只要给个评论区链接让门酱访问就可 我们研究下评论区 从评论区知道&#xff0c;要…

建立知识体系,这份指南就够了

最近&#xff0c;许多读者私信我&#xff0c;问到这个问题。 恰好又要推送了&#xff0c;索性分享一些心得。 说实话&#xff0c;这是个很大的问题&#xff0c;要彻底讲透&#xff0c;大概得写一整本书。 所以&#xff0c;我尝试用尽量简洁的篇幅&#xff0c;将这个问题说清楚。…

Redis进阶(二):事务

redis事务特点 弱化的原子性 redis事务的原子性不像MySQL原子性一样&#xff0c;执行不成功的话&#xff0c;redis事务不会进行回滚操作 不具备一致性 redis没有约束&#xff0c;也没有回滚机制&#xff0c;因此事务执行的过程中如果某个修改操作出现失败&#xff0c;就可能引起…

研究多态恶意软件,探讨网络安全与AI

前言 近期ChatGPT火遍全球&#xff0c;AI技术被应用到了全球各行各业当中&#xff0c;国内外各大厂商也开始推出自己的ChatGPT&#xff0c;笔者所在公司在前段时间也推出了自研的安全GPT&#xff0c;AI技术在网络安全行业得到了很多的应用&#xff0c;不管是网络安全研究人员、…

ClickHouse--05--MergeTree 表引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MergeTree 系列表引擎前言MergeTree 系列表引擎 --功能MergeTree 系列表引擎 --种类 1.MergeTree1.1MergeTree 建表语句&#xff1a;1.2 MergeTree 引擎表目录解析查…

vscode-python的debug 教学(最全)

vscode中的python-debugger的使用 Visual Studio Code 的主要功能之一是其强大的调试支持。VS Code 的内置调试器有助于加速编辑、编译和调试循环。 一、 安装python-debugger插件 在插件库内搜索python Debugger&#xff0c;安装插件 三、 进行debug&#xff08;不带参数…

Linux查看日志的几种方法总结

摘要 Linux系统中查看日志的命令确实多种多样&#xff0c;每个命令都有其特定的用途和优势。常用的命令有&#xff1a;tail、cat、tac、head、echo&#xff0c;grep、less、awk、sed。 下面我会详细解释这些命令在查看日志时的用法和特点&#xff1a; tail命令&#xff1a; ta…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6&#xff0c;MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…