这个博主写的很好,推荐大家看看其系列文章

链接: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 点云平移与旋转相关推荐

  1. PCL:点云平移、旋转

    PCL提供了两种点云平移.旋转的方式 方式1:使用Matrix4f手动输入坐标平移.旋转矩阵,理解更直观,但易出错 方式2:使用Affine3f定义坐标平移.旋转矩阵,简单且不易出错 代码实现: #i ...

  2. 点云处理--点云平移和旋转

    1.版本要求 版本: >PCL1.5 2.简介 1)有时我们需要平移点云到我们需要的位置,例如:进行ICP配准前需要移动待配准点云到目标点云附近. 2)有时我们需要旋转点云到我们需要的位置. 3 ...

  3. PCL 点云的旋转与平移

    PCL提供了两种点云平移.旋转的方式 方式1:使用Matrix4f手动输入坐标平移.旋转矩阵,理解更直观,但易出错 方式2:使用Affine3f定义坐标平移.旋转矩阵,简单且不易出错 代码实现: #i ...

  4. 《PCL点云库学习VS2010(X64)》Part 34 旋转平移矩阵用法

    <PCL点云库学习&VS2010(X64)>Part 34 旋转平移矩阵用法 1.变换与投影矩阵讲解: https://en.wikipedia.org/wiki/Transfor ...

  5. 3D点云变换(平移、旋转、缩放)C++实现

    在前一篇文章3D点云变换(平移.旋转.缩放)以及python实现中详细介绍了点云的一些基础变换原理,也用python做了实现,这次我们用C++来做点云的平移.缩放.旋转变换. #include < ...

  6. 点云旋转平移(二)—python open3d点云平移

    点云旋转平移介绍,请参考上一节:点云旋转平移(一)-基础知识介绍_Coding的叶子的博客-CSDN博客. 本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下 ...

  7. qgraphicsview鼠标移动图片_交互式QGraphicsView(平移/缩放/旋转)-阿里云开发者社区...

    简述 Graphics View提供了一个平台用于大量自定义 2D 图元的管理与交互框架包括一个事件传播架构支持场景 Scene 中的图元 Item 进行精确的双精度交互功能.Item 可以处理键盘事 ...

  8. PCL点云处理算法目录

    一.点云配准 PCL中的点云配准方法:https://www.sohu.com/a/321034987_715754 点云配准资源汇总:https://mp.weixin.qq.com/s/rj090 ...

  9. PCL 点云特征描述与提取

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:开着拖拉机唱山歌 链接:https://zhuanlan.zhihu.com/p/1032192 ...

最新文章

  1. Speedata uhf_7.6.3.jar错误硬代码问题
  2. EtherChannel Cisco 端口聚合详解
  3. Asp中一些FSO方面的函数
  4. 深入iOS系统底层之CPU寄存器介绍
  5. .NET Core 1.0 RC2 历险之旅
  6. Wing IDE 5.0 破解之寻找注册码
  7. USACO-Section1.4 Ski Course Design (枚举)
  8. ASP.NET MVC 3.0学习系列文章(开始学习MVC)
  9. 【转】宝贝,我要出嫁了……
  10. websocket动态添加广播路径_数据可视化WebSocket实现聊聊我的实现思路
  11. 用递归来实现汉诺塔的问题
  12. ActiveMQ使用教程
  13. 第九届蓝桥杯单片机省赛试题
  14. MATLAB生成M序列和Gold序列
  15. 明朝取代元朝鲜为人知的秘密
  16. 江苏计算机电缆报价,江苏价格低的阻燃计算机电缆
  17. 《操作系统之哲学原理(第2版)》——— 操作系统的发展历史
  18. PrintSpool 服务经常自动停止!
  19. python+request接口测试
  20. 继SDS之后又迎来CDM,存储行业真要变天了?

热门文章

  1. lammps教程:delete_atoms删除原子后原子ID不连续的两种解决方案
  2. java协议标准与规范
  3. NASA发布史上最深的宇宙全彩照!韦伯如何回传150万公里外的太空数据?
  4. 优缺点 快速扫描 硬盘监测_MHDD快速检测硬盘坏道
  5. 微原实验二 数码转换
  6. word表格分开快捷键_在Word 表格的编辑中,快速拆分表格应按快捷键为______。
  7. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)
  8. 百度搜索公正性彻底调查
  9. 微信小程序获取rich-text(富文本)渲染内容高度,rich-text(富文本)里img 样式设置
  10. 区块链双花攻击和自私采矿攻击的系统防御概述 论文解读