点云旋转处理

实现代码为:

//以中心化点进行旋转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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸&#xff0c;被东北大学通信工程录取&#xff0c;其中专业课841通信专业基础140&#xff0c;数二140&#xff0c;总分420&#xff0c;整体每门课都还是比较均衡&#xff0c;刚开始考研前也和大家一样&#xff0c;焦虑&#xff0c;紧张&#xff0c;面对考研怕失…

Web课程学习笔记--CSS-Sprite的应用

雪碧图CSS Sprite的应用 CSS雪碧&#xff0c;即CSS Sprite&#xff0c;也有人叫它CSS精灵&#xff0c;是一种CSS图像合并技术&#xff0c;该方法是将小图标和背景图像合并到一张图片上&#xff0c;然后利用css的背景定位来显示需要显示的图片部分。例如常见的商品分类导航其实所…

阿里云游戏服务器一年费用多少?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说&#xff0c;是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

软件测试【三】Python中的数据类型

一、Python中的数据类型: python中的list列表定义 在Python中&#xff0c;list是一种有序的数据类型&#xff0c;可以存储任意类型的对象&#xff0c;包括数字、字符串、布尔值、函数等。 定义一个list列表可以使用中括号[]来表示&#xff0c;其中每个元素之间用逗号隔开。以…

anomalib1.0学习纪实

回顾&#xff1a;细分、纵深、高端、上游、积累、极致。 回顾&#xff1a;产品化&#xff0c;资本化&#xff0c;规模化&#xff0c;大干快上&#xff0c;小农思维必死无疑。 春节在深圳新地中央&#xff0c;学习anomalib1.0。 一、安装&#xff1a; 1、常规安装 采用的是…

蓝桥杯:C++排列与组合

排列是暴力枚举时的常见操作。有以下两种情况。 C的 next_permutation()是全排列函数&#xff0c;只能输出序列中所有元素的全排列。 本节将给出手写排列和组合的代码。因为在很多场合中不能使用系统自带的排列函数&#xff0c;所以需要自己编写。 全排列函数&#xff1a;nex…

SpringCloud之Eureka注册中心和负载均衡

SpringCloud之Eureka注册中心和负载均衡 微服务技术栈认识微服务单体架构分布式架构微服务 微服务拆分及远程调用微服务拆分注意事项 Eureka注册中心提供者与消费者原理分析服务调用出现的问题Eureka的作用 使用流程1、搭建EurekaServer2、注册user-service3、在order-service完…

BUGKU-WEB 你必须让他停下

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 图片会消失,那应该是使用了js来控制根据提示,那就是要停止js才会看到flag (也就是要抓包,不要陷入停止js的思维) 相关工具 F12大法Burp Suit抓包工具 解题步骤 出现图片的时候,源码中确实出现…

NULL和nullptr到底是什么?它们的区别又是什么?

目录 1.前言 2.剖析NULL 3. 剖析nullptr 4.nullptr与NULL的区别 1.前言 为了保持良好的编程习惯&#xff0c;我们在声明某个变量时都应该给这个变量合适的初始值&#xff0c;不然容易出现不可预知的错误。对于指针来说更是如此&#xff0c;在c语言中我们就通常将暂时没有指向…

【Spring MVC篇】返回响应

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、返回静态页面…

(13)Hive调优——动态分区导致的小文件问题

前言 动态分区指的是&#xff1a;分区的字段值是基于查询结果自动推断出来的&#xff0c;核心语法就是insertselect。 具体内容指路文章&#xff1a; https://blog.csdn.net/SHWAITME/article/details/136111924?spm1001.2014.3001.5501文章浏览阅读483次&#xff0c;点赞15次…

如何买卖基金

一、从哪买卖&#xff1f; &#xff08;一&#xff09;购买渠道 有两种购买渠道&#xff1a;直销平台和代销平台。 1.直销平台 就是基金公司。 每个基金公司只能卖自家基金产品。比如招商基金只能卖招商基金管理的基金&#xff0c;而不能卖广发基金的产品。 如何去基金公司购…

2024年最新onlyfans虚拟信用卡订阅教程

一、Onlyfans是什么&#xff1f; OnlyFans是一个允许创作者分享自己的独家内容的平台&#xff0c;简称o站。这个平台允许创作者创建一个订阅服务&#xff0c;粉丝需要支付费用才能访问其独家内容。 本文将教你如何使用虚拟卡在OnlyFans上进行充值。 二、如何使用虚拟卡支付 O…

变形金刚:第 2 部分:变形金刚的架构

目录 一、说明 二、实现Transformer的过程 第 1 步&#xff1a;代币化&#xff08;Tokenization&#xff09; 第 2 步&#xff1a;对每个单词进行标记嵌入 第 3 步&#xff1a;对每个单词进行位置嵌入 第 4 步&#xff1a;输入嵌入 第 5 步&#xff1a;编码器层 2.5.1 多头自注…

【MySQL】高度为2和3时B+树能够存储的记录数量的计算过程

文章目录 题目答案高度为2时的B树高度为3时的B树总结 GPT4 对话过程 题目 InnoDB主键索引的Btree在高度分别为 2 和 3 时&#xff0c;可以存储多少条记录&#xff1f; 答案 高度为2时的B树 计算过程&#xff1a; 使用公式 ( n 8 ( n 1 ) 6 16 1024 ) (n \times 8 …

二维数组及函数的非函数实现

2024年2月14日 1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<stdlib.h> #include<string.h> void Yanghui(int n,int (*p)[n]) {for(int i0;i<n;i){for(int j0;j<i;j){if(j0||ij){*(*(pi)j)1;}else{*(*(pi)j)*(*(pi-1)j-1)*(*(pi-1)j)…

相机图像质量研究(15)常见问题总结:光学结构对成像的影响--暗角

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

456. 车站分级(拓扑排序,虚拟点建图)

活动 - AcWing 一条单向的铁路线上&#xff0c;依次有编号为 1, 2, …, n1,  的 n 个火车站。 每个火车站都有一个级别&#xff0c;最低为 1 级。 现有若干趟车次在这条线路上行驶&#xff0c;每一趟都满足如下要求&#xff1a;如果这趟车次停靠了火车站 x&#xff0c;…

Elasticsearch:特定领域的生成式 AI - 预训练、微调和 RAG

作者&#xff1a;来自 Elastic Steve Dodson 有多种策略可以将特定领域的知识添加到大型语言模型 (LLM) 中&#xff0c;并且作为积极研究领域的一部分&#xff0c;正在研究更多方法。 对特定领域数据集进行预训练和微调等方法使 LLMs 能够推理并生成特定领域语言。 然而&#…