点云旋转处理

实现代码为:

//以中心化点进行旋转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.hqwc.cn/news/469924.html

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

相关文章

PHP+vue+mysql校园学生社团管理系统574cc

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 前台功能&#xff1a; 首页&#xff1a;展示社团信息和活动…

Dynamo设置明细表字段格式——保留小数位数

Hello大家好&#xff01;我是九哥~ 今天简单分享一个API的用法&#xff0c;就是设置明细表的中字段的字段格式。 本次呢&#xff0c;主要介绍下如何通过Dynamo设置长度、面积等几种字段的格式&#xff0c;设置小数位数的显示&#xff0c;如下图&#xff1a; 当然了&#xf…

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

博客原文 文章目录 前言集群环境nfs 环境搭建pod 挂载 nfs架构图 pvc 方式挂载 nfs架构图 storageclass 方式动态申请 pv架构图 参考 前言 持久化卷&#xff08;Persistent Volume, PV&#xff09;允许用户将外部存储映射到集群&#xff0c;而持久化卷申请&#xff08;Persist…

全面理解JVM虚拟机

为什么要学JVM&#xff1f; ​ 首先&#xff1a;面试需要。面试题层出不穷&#xff0c;难道每次面试都靠背几百上千条面试八股&#xff1f; ​ 其次&#xff1a;基础决定上层建筑。自己写的代码都不知道是怎么回事&#xff0c;怎么可能写出靠谱的系统&#xff1f; ​ 然后&a…

【Web】从零开始的js逆向学习笔记(上)

目录 一、逆向基础 1.1 语法基础 1.2 作用域 1.3 窗口对象属性 1.4 事件 二、浏览器控制台 2.1 Network Network-Headers Network-Header-General Network-Header-Response Headers Network-Header-Request Headers 2.2 Sources 2.3 Application 2.4 Console 三、…

降噪和音频修复 iZotope RX 7 Advanced

iZotope RX 7 Advanced 是一款功能强大的音频修复和增强软件&#xff0c;它能够帮助用户轻松应对各种音频问题&#xff0c;提供全面的工具和技术来优化和改善音频质量。 首先&#xff0c;iZotope RX 7 Advanced 具有出色的降噪功能。无论是背景噪音、杂音还是其他干扰因素&…

鲁南制药“健康幸福中国年”主题航班,开启探寻健康与幸福的旅程

“小年&#xff0c;小年&#xff0c;过了今天就是年。”提到过年&#xff0c;北方人的“过年”是从腊月二十三的“小年”开始的&#xff0c;而南方地区是在明天。虽然时间不同&#xff0c;但是浓浓的年味是一样的&#xff0c;红彤彤是主色调&#xff0c;喜洋洋是主乐曲&#xf…

【机器学习案例3】从科学论文图片中提取标题、作者和摘要【含源码】

在这个项目中,我的目标是从科学论文图片中提取某些部分(标题、作者和摘要)。预期提取部分是科学论文中常见的部分,例如标题、摘要和作者。输入与最终结果。我的输入是将第一页纸转换成图像。最终结果是一个 txt 文件,其中包含标题、作者和摘要部分,如下图1和图2所示。我将…

山西电力市场日前价格预测【2024-02-11】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-11&#xff09;山西电力市场全天平均日前电价为121.99元/MWh。其中&#xff0c;最高日前电价为475.98元/MWh&#xff0c;预计出现在19:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号&#xff1a; T 002 。 \color{red}{本文项目编号&#xff1a;T002。} 本文项目编号&#xff1a;T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …

FreeRTOS 队列管理

概览 基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权 限的小程序。这些独立的任务之间很可能会通过相互通信以提供有用的系统功能。 FreeRTOS 中所有的通信与同步机制都是基于队列实现的。 本章期望让读者了解以下事情   如何创建一个队列   …

【MySQL】学习外键约束处理员工数据

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-g4glZPIY0IKhiTfe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…