PCL 点云平移与旋转
这个博主写的很好,推荐大家看看其系列文章
链接:http://www.pianshen.com/tag/PCL/
#include <iostream>#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_cloud.h>
#include <pcl/console/parse.h>
#include <pcl/common/transforms.h> // pcl::transformPointCloud 用到这个头文件
#include <pcl/visualization/pcl_visualizer.h>// 帮助函数
void
showHelp(char *program_name) {std::cout << std::endl;std::cout << "Usage: " << program_name << " cloud_filename.[pcd|ply]" << std::endl;std::cout << "-h: Show this help." << std::endl;
}// 主函数
int
main (int argc, char **argv) {// 如果没有输入预期的参数程序将显示帮助if (pcl::console::find_switch (argc, argv, "-h") || pcl::console::find_switch (argc, argv, "--help")) {showHelp (argv[0]);return 0;}// 从主函数参数查找点云数据文件 (.PCD|.PLY)std::vector<int> filenames;bool file_is_pcd = false;filenames = pcl::console::parse_file_extension_argument (argc, argv, ".ply");if (filenames.size () != 1) {filenames = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");if (filenames.size () != 1) {showHelp (argv[0]);return -1;} else {file_is_pcd = true;}}// 加载点云数据文件pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud (new pcl::PointCloud<pcl::PointXYZ> ());if (file_is_pcd) {if (pcl::io::loadPCDFile (argv[filenames[0]], *source_cloud) < 0) {std::cout << "Error loading point cloud " << argv[filenames[0]] << std::endl << std::endl;showHelp (argv[0]);return -1;}} else {if (pcl::io::loadPLYFile (argv[filenames[0]], *source_cloud) < 0) {std::cout << "Error loading point cloud " << argv[filenames[0]] << std::endl << std::endl;showHelp (argv[0]);return -1;}}/* 提示: 变换矩阵工作原理 :|-------> 变换矩阵列| 1 0 0 x | \| 0 1 0 y | }-> 左边是一个3阶的单位阵(无旋转)| 0 0 1 z | /| 0 0 0 1 | -> 这一行用不到 (这一行保持 0,0,0,1)方法一 #1: 使用 Matrix4f这个是“手工方法”,可以完美地理解,但容易出错!*/Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();// 定义一个旋转矩阵 (见 https://en.wikipedia.org/wiki/Rotation_matrix)float theta = M_PI / 4; // 弧度角transform_1 (0, 0) = cos (theta);transform_1 (0, 1) = -sin(theta);transform_1 (1, 0) = sin (theta);transform_1 (1, 1) = cos (theta);// (行, 列)// 在 X 轴上定义一个 2.5 米的平移.transform_1 (0, 3) = 2.5;// 打印变换矩阵printf ("Method #1: using a Matrix4f\n");std::cout << transform_1 << std::endl;/* 方法二 #2: 使用 Affine3f这种方法简单,不易出错*/Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();// 在 X 轴上定义一个 2.5 米的平移.transform_2.translation() << 2.5, 0.0, 0.0;// 和前面一样的旋转; Z 轴上旋转 theta 弧度transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ()));// 打印变换矩阵printf ("\nMethod #2: using an Affine3f\n");std::cout << transform_2.matrix() << std::endl;// 执行变换,并将结果保存在新创建的 transformed_cloud 中pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ> ());// 可以使用 transform_1 或 transform_2; t它们是一样的pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_2);// 可视化// 可视化将原始点云显示为白色,变换后的点云为红色,还设置了坐标轴、背景颜色、点显示大小printf( "\nPoint cloud colors : white = original point cloud\n"" red = transformed point cloud\n");pcl::visualization::PCLVisualizer viewer ("Matrix transformation example");// 为点云定义 R,G,B 颜色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler (source_cloud, 255, 255, 255);// 输出点云到查看器,使用颜色管理viewer.addPointCloud (source_cloud, source_cloud_color_handler, "original_cloud");pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler (transformed_cloud, 230, 20, 20); // 红viewer.addPointCloud (transformed_cloud, transformed_cloud_color_handler, "transformed_cloud");viewer.addCoordinateSystem (1.0, "cloud", 0);viewer.setBackgroundColor(0.05, 0.05, 0.05, 0); // 设置背景为深灰viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud");viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "transformed_cloud");//viewer.setPosition(800, 400); // 设置窗口位置while (!viewer.wasStopped ()) { // 在按下 "q" 键之前一直会显示窗口viewer.spinOnce ();}return 0;
}
PCL 点云平移与旋转相关推荐
- PCL:点云平移、旋转
PCL提供了两种点云平移.旋转的方式 方式1:使用Matrix4f手动输入坐标平移.旋转矩阵,理解更直观,但易出错 方式2:使用Affine3f定义坐标平移.旋转矩阵,简单且不易出错 代码实现: #i ...
- 点云处理--点云平移和旋转
1.版本要求 版本: >PCL1.5 2.简介 1)有时我们需要平移点云到我们需要的位置,例如:进行ICP配准前需要移动待配准点云到目标点云附近. 2)有时我们需要旋转点云到我们需要的位置. 3 ...
- PCL 点云的旋转与平移
PCL提供了两种点云平移.旋转的方式 方式1:使用Matrix4f手动输入坐标平移.旋转矩阵,理解更直观,但易出错 方式2:使用Affine3f定义坐标平移.旋转矩阵,简单且不易出错 代码实现: #i ...
- 《PCL点云库学习VS2010(X64)》Part 34 旋转平移矩阵用法
<PCL点云库学习&VS2010(X64)>Part 34 旋转平移矩阵用法 1.变换与投影矩阵讲解: https://en.wikipedia.org/wiki/Transfor ...
- 3D点云变换(平移、旋转、缩放)C++实现
在前一篇文章3D点云变换(平移.旋转.缩放)以及python实现中详细介绍了点云的一些基础变换原理,也用python做了实现,这次我们用C++来做点云的平移.缩放.旋转变换. #include < ...
- 点云旋转平移(二)—python open3d点云平移
点云旋转平移介绍,请参考上一节:点云旋转平移(一)-基础知识介绍_Coding的叶子的博客-CSDN博客. 本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下 ...
- qgraphicsview鼠标移动图片_交互式QGraphicsView(平移/缩放/旋转)-阿里云开发者社区...
简述 Graphics View提供了一个平台用于大量自定义 2D 图元的管理与交互框架包括一个事件传播架构支持场景 Scene 中的图元 Item 进行精确的双精度交互功能.Item 可以处理键盘事 ...
- PCL点云处理算法目录
一.点云配准 PCL中的点云配准方法:https://www.sohu.com/a/321034987_715754 点云配准资源汇总:https://mp.weixin.qq.com/s/rj090 ...
- PCL 点云特征描述与提取
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:开着拖拉机唱山歌 链接:https://zhuanlan.zhihu.com/p/1032192 ...
最新文章
- Speedata uhf_7.6.3.jar错误硬代码问题
- EtherChannel Cisco 端口聚合详解
- Asp中一些FSO方面的函数
- 深入iOS系统底层之CPU寄存器介绍
- .NET Core 1.0 RC2 历险之旅
- Wing IDE 5.0 破解之寻找注册码
- USACO-Section1.4 Ski Course Design (枚举)
- ASP.NET MVC 3.0学习系列文章(开始学习MVC)
- 【转】宝贝,我要出嫁了……
- websocket动态添加广播路径_数据可视化WebSocket实现聊聊我的实现思路
- 用递归来实现汉诺塔的问题
- ActiveMQ使用教程
- 第九届蓝桥杯单片机省赛试题
- MATLAB生成M序列和Gold序列
- 明朝取代元朝鲜为人知的秘密
- 江苏计算机电缆报价,江苏价格低的阻燃计算机电缆
- 《操作系统之哲学原理(第2版)》——— 操作系统的发展历史
- PrintSpool 服务经常自动停止!
- python+request接口测试
- 继SDS之后又迎来CDM,存储行业真要变天了?
热门文章
- lammps教程:delete_atoms删除原子后原子ID不连续的两种解决方案
- java协议标准与规范
- NASA发布史上最深的宇宙全彩照!韦伯如何回传150万公里外的太空数据?
- 优缺点 快速扫描 硬盘监测_MHDD快速检测硬盘坏道
- 微原实验二 数码转换
- word表格分开快捷键_在Word 表格的编辑中,快速拆分表格应按快捷键为______。
- POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)
- 百度搜索公正性彻底调查
- 微信小程序获取rich-text(富文本)渲染内容高度,rich-text(富文本)里img 样式设置
- 区块链双花攻击和自私采矿攻击的系统防御概述 论文解读