精华内容
下载资源
问答
  • 点云变换矩阵
    2022-08-07 00:51:50

    一、简介

    这里的转换主要使用的是旋转+平移矩阵,详细内容可以参考:CloudCompare&PCL 点云刚性旋转之旋转矩阵

    二、实现代码

    相关配置可以参看:Open3D C++文章目录汇总中的基础配置部分,相关代码如下所示:

    #define OPEN3D_VISUALIZATION_HEARER
    #
    更多相关内容
  • 点云矩阵变换

    千次阅读 2021-05-17 22:33:57
    变换矩阵工作原理 : |-------> 变换矩阵列 | 1 0 0 x | \ | 0 1 0 y | }-> 左边是一个3阶的单位阵(无旋转) | 0 0 1 z | / | 0 0 0 1 | -> 这一行用不到 (这一行保持 0,0,0,1) 要进行点云旋转,需要对...

    点云矩阵变换

    变换矩阵工作原理 :

              |-------> 变换矩阵列
        | 1 0 0 x |  \
        | 0 1 0 y |   }-> 左边是一个3阶的单位阵(无旋转)
        | 0 0 1 z |  /
        | 0 0 0 1 |    -> 这一行用不到 (这一行保持 0,0,0,1)
    

    要进行点云旋转,需要对3阶矩阵进行赋值
    如何赋值参考:https://blog.csdn.net/weixin_39637723/article/details/111686018
    pcl中使用参考:https://blog.csdn.net/weixin_38275649/article/details/80968364

    世界坐标系与相机坐标系转换

    世界坐标系与相机坐标系转换是一样的,如下是X由世界坐标转换到相机坐标系,并由内参矩阵K变换到图像坐标(这里X是列向量
    在这里插入图片描述

    内参矩阵K:
    在这里插入图片描述

    内参外参、世界坐标系与相机坐标系转换:https://blog.csdn.net/qq_33801763/article/details/77033064

    旋转变换实现

    参考:https://blog.csdn.net/weixin_42783619/article/details/116478710

    变换矩阵(Translation Matrix)

    如果我们需要表示一个3D空间的平移,那得需要一个4*4的矩阵。首先,我们预定义坐标向量都是列的形式,如果是行的形式,要先进行转置变换。

    旋转平移矩阵的形式如下:
    在这里插入图片描述
    其中Transform_XAxis是新坐标系下的x轴的方向,Transform_YAxis是新坐标系下的y轴的方向,其中Transform_ZAxis是新坐标系下的z轴的方向。Translation 描述了新空间相对于活动空间的位置

    某些情况下,我们需要简单的变换,类似平移和旋转。

    Translation 平移

    在这里插入图片描述
    其中translation是一个3D的向量,代表我们想要移动空间的位置。

    尺度矩阵(Scale Matrix)

    在这里插入图片描述

    这个比较好理解。scale是一个3D向量,表示每个轴的缩放尺度。

    旋转矩阵(Rotation Matrix)

    • 绕x轴旋转θ:
      在这里插入图片描述

    • 绕y轴旋转:
      在这里插入图片描述

    • 绕z轴旋转:
      在这里插入图片描述

    参考:https://52zju.cn/?p=580
    其他参考:https://zhuanlan.zhihu.com/p/147282442
    旋转矩阵变换的乘积顺序问题:https://blog.csdn.net/potato_uncle/article/details/110096514
    两个旋转矩阵(Rotation Matrix)相乘(Multiply)的几何意义:https://dawnarc.com/2017/02/math两个旋转矩阵rotation-matrix相乘multiply的几何意义/
    实现参考:https://www.learnopencv.com/rotation-matrix-to-euler-angles/
    https://blog.csdn.net/reasonyuanrobot/article/details/89969676
    https://blog.csdn.net/u011808673/article/details/93970439

    展开全文
  • matlab开发-点云的时程转换图像时程转换矩阵。将hough变换应用于二维点云或计算矩阵以应用ht
  • 在自己项目中创建一个cpp文件复制以下代码: 说明:1.所需要的头文件 2.如果用户没有提供预期的参数,此函数会显示帮助 3. 我们在命令行上解析参数,使用-h 或-...6.创建转换矩阵,我们将一个 4x4 矩阵初始化为

    在自己项目中创建一个cpp文件

    复制以下代码:

    #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>
    #include <pcl/visualization/pcl_visualizer.h>
    
     // This function displays the help
     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;
     }
     
     // This is the main function
     int
     main (int argc, char** argv)
     {
     
       // Show help
       if (pcl::console::find_switch (argc, argv, "-h") || pcl::console::find_switch (argc, argv, "--help")) {
         showHelp (argv[0]);
         return 0;
       }
     
       // Fetch point cloud filename in arguments | Works with PCD and PLY files
       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;
         }
       }
     
       // Load file | Works with PCD and PLY files
       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;
         }
       }
     
       /* Reminder: how transformation matrices work :
     
                |-------> This column is the translation
         | 1 0 0 x |  \
         | 0 1 0 y |   }-> The identity 3x3 matrix (no rotation) on the left
         | 0 0 1 z |  /
         | 0 0 0 1 |    -> We do not use this line (and it has to stay 0,0,0,1)
     
         METHOD #1: Using a Matrix4f
         This is the "manual" method, perfect to understand but error prone !
       */
       Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();
     
       // Define a rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix)
       float theta = M_PI/4; // The angle of rotation in radians
       transform_1 (0,0) = std::cos (theta);
       transform_1 (0,1) = -sin(theta);
       transform_1 (1,0) = sin (theta);
       transform_1 (1,1) = std::cos (theta);
       //    (row, column)
     
       // Define a translation of 2.5 meters on the x axis.
       transform_1 (0,3) = 2.5;
     
       // Print the transformation
       printf ("Method #1: using a Matrix4f\n");
       std::cout << transform_1 << std::endl;
     
       /*  METHOD #2: Using a Affine3f
         This method is easier and less error prone
       */
       Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();
     
       // Define a translation of 2.5 meters on the x axis.
       transform_2.translation() << 2.5, 0.0, 0.0;
     
      // The same rotation matrix as before; theta radians around Z axis
      transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ()));
    
      // Print the transformation
      printf ("\nMethod #2: using an Affine3f\n");
      std::cout << transform_2.matrix() << std::endl;
    
      // Executing the transformation
      pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
      // You can either apply transform_1 or transform_2; they are the same
      pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_2);
    
      // Visualization
      printf(  "\nPoint cloud colors :  white  = original point cloud\n"
          "                        red  = transformed point cloud\n");
      pcl::visualization::PCLVisualizer viewer ("Matrix transformation example");
    
       // Define R,G,B colors for the point cloud
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler (source_cloud, 255, 255, 255);
      // We add the point cloud to the viewer and pass the color handler
      viewer.addPointCloud (source_cloud, source_cloud_color_handler, "original_cloud");
    
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler (transformed_cloud, 230, 20, 20); // Red
      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); // Setting background to a dark grey
      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); // Setting visualiser window position
    
      while (!viewer.wasStopped ()) { // Display the visualiser until 'q' key is pressed
        viewer.spinOnce ();
      }
    
      return 0;
    }

     说明:

    1.所需要的头文件

    #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>
    #include <pcl/visualization/pcl_visualizer.h>

    2.如果用户没有提供预期的参数,此函数会显示帮助

    // This function displays the help
    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;
    }

    3. 我们在命令行上解析参数,使用-h 或-help 将显示帮助。这将终止程序

    // Show help
      if (pcl::console::find_switch (argc, argv, "-h") || pcl::console::find_switch (argc, argv, "--help")) {
        showHelp (argv[0]);
        return 0;
      }

    4.在参数中查找 .ply 或 .pcd 文件名。如果没有找到;终止程序。bool file_is_pcd将帮助我们在加载 PCD 或 PLY 文件之间进行选择。

    // Fetch point cloud filename in arguments | Works with PCD and PLY files
      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;
        }
      }

    5.加载 PCD/PLY 文件并检查文件是否加载成功。否则终止程序。

    // Load file | Works with PCD and PLY files
      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;
        }
      }

    6.创建转换矩阵,我们将一个 4x4 矩阵初始化为恒等式;

    /* Reminder: how transformation matrices work :
    
               |-------> This column is the translation
        | 1 0 0 x |  \
        | 0 1 0 y |   }-> The identity 3x3 matrix (no rotation) on the left
        | 0 0 1 z |  /
        | 0 0 0 1 |    -> We do not use this line (and it has to stay 0,0,0,1)
    
        METHOD #1: Using a Matrix4f
        This is the "manual" method, perfect to understand but error prone !
      */
      Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();
        |  1  0  0  0  |
    i = |  0  1  0  0  |
        |  0  0  1  0  |
        |  0  0  0  1  |

    7.前 3 行和前 3 列(左上)分量是旋转矩阵。最后一列的前 3 行是平移向量。在这里,我们定义了围绕 Z 轴的 45° (PI/4) 旋转和 X 轴上的平移。

    // Define a rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix)
      float theta = M_PI/4; // The angle of rotation in radians
      transform_1 (0,0) = std::cos (theta);
      transform_1 (0,1) = -sin(theta);
      transform_1 (1,0) = sin (theta);
      transform_1 (1,1) = std::cos (theta);
      //    (row, column)
    
      // Define a translation of 2.5 meters on the x axis.
      transform_1 (0,3) = 2.5;
    
      // Print the transformation
      printf ("Method #1: using a Matrix4f\n");
      std::cout << transform_1 << std::endl;

    这就是我们刚刚定义的转换

        |  cos(θ) -sin(θ)  0.0 |
    R = |  sin(θ)  cos(θ)  0.0 |
        |  0.0     0.0     1.0 |
    
    t = < 2.5, 0.0, 0.0 >

    8. 第二种方法,如果要应用多次旋转,要注意;旋转不是可交换的 rotA * rotB != rotB * rotA。

    /*  METHOD #2: Using a Affine3f
        This method is easier and less error prone
      */
      Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();
    
      // Define a translation of 2.5 meters on the x axis.
      transform_2.translation() << 2.5, 0.0, 0.0;
    
      // The same rotation matrix as before; theta radians around Z axis
      transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ()));
    
      // Print the transformation
      printf ("\nMethod #2: using an Affine3f\n");
      std::cout << transform_2.matrix() << std::endl;

    9.现在我们在点云source_cloud上应用这个矩阵,并将结果保存在新创建的transformed_cloud中。

    // Executing the transformation
      pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
      // You can either apply transform_1 or transform_2; they are the same
      pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_2);

    10.使用PCLVisualizer可视化结果。原始点云将显示为白色,转换后的点云将显示为红色。将显示坐标轴。我们还设置了可视化工具的背景颜色和点显示大小。

      // Visualization
      printf(  "\nPoint cloud colors :  white  = original point cloud\n"
          "                        red  = transformed point cloud\n");
      pcl::visualization::PCLVisualizer viewer ("Matrix transformation example");
    
       // Define R,G,B colors for the point cloud
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler (source_cloud, 255, 255, 255);
      // We add the point cloud to the viewer and pass the color handler
      viewer.addPointCloud (source_cloud, source_cloud_color_handler, "original_cloud");
    
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler (transformed_cloud, 230, 20, 20); // Red
      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); // Setting background to a dark grey
      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); // Setting visualiser window position
    
      while (!viewer.wasStopped ()) { // Display the visualiser until 'q' key is pressed
        viewer.spinOnce ();
      }
    
      return 0;

    编译运行程序:

    将以下行添加到 CMakeLists.txt 文件中:

     cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
     
     project(pcl-matrix_transform)
     
     find_package(PCL 1.7 REQUIRED)
     
     include_directories(${PCL_INCLUDE_DIRS})
     link_directories(${PCL_LIBRARY_DIRS})
     add_definitions(${PCL_DEFINITIONS})
    
     add_executable (matrix_transform matrix_transform.cpp)
     target_link_libraries (matrix_transform ${PCL_LIBRARIES})

     生成可执行文件后,运行它并传递 PCD 或 PLY 文件的路径。要重现如下所示的结果,您可以下载cube.ply文件:

    $ ./matrix_transform cube.ply

     

    展开全文
  • 给两个向量,算旋转变换矩阵,将矩阵转换成欧拉角进行验证
  • CloudCompare【4】点云配准矩阵说明

    千次阅读 2021-12-10 15:21:44
    aligned-移动的PCL源点云bunny4 reference-不动的PCL目标点云bunny3 得到的矩阵是从bunny4到bunny3的变换矩阵 wrap 把一片点云bunny3封装成模型,bunny4为浮动的,此时移动bunny4到bunny3上,输出矩阵是bunny4到...
  • SVD分解求变换矩阵——ICP算法的重要计算步骤
  • 点云仿射变换—open3d python

    千次阅读 2022-04-26 14:00:25
    仿射变换、投影变换通俗理解,python open3d变换数据与源码实验,详解open3d的transform函数
  • Affine3f 和Matrix4f 同为4*4矩阵,但是Affine3f 本质是个变换矩阵,有成员函数。 // 执行变换,并将结果保存在新创建的‎‎ transformed_cloud ‎‎中 pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud ...
  • CloudCompare——点云变换

    千次阅读 2021-09-04 08:24:44
    点云的平移、旋转、缩放、欧拉角、旋转向量、齐次变换等。
  • 大家好,我是小鱼,最近因为工作上的需要,把自己一两年前做的开源库又进行了维护,新增了点云坐标转换功能,小鱼测试速度可以嗖嗖的.再次分享给大家.这个库功能和ROS的TF相似,但完全基于Eigen实现,不用像ROS那样需要很多...
  • 本文主要是计算两个激光雷达之间的变换矩阵,即计算两组点云之间的变换矩阵。其中处理的点云数据主要是由x,y,z,intensity组成的,代表空间位置x,ry,z 和每个点云对应的反射强度intensity; 这里计算点集之间的变换...
  • 旋转点云 本专栏所有内容都是基于visual ...计算旋转矩阵的逆矩阵,应用SVD分解法,巴拉巴拉 代码 #pragma warning(disable:4996) #include <pcl/registration/ia_ransac.h>//采样一致性 #include <pcl/po
  • 使用matlab自带函数实现四元数配准
  • 点云变换 如果是刚性变换,一般是齐次变换矩阵,包含旋转和平移两个部分,MATLAB提供了函数rigid3d来构建矩阵 tform = rigid3d tform = rigid3d(t) tform = rigid3d(rot,trans) 这里简单说一下这3种构造方法 1. ...
  • PCA、协方差矩阵及其在点云处理中的应用 文章目录PCA、协方差矩阵及其在点云处理中的应用目的PCA推导特征值分解奇异值分解奇异值分解同特征值分解的关系点云处理中的应用参考链接 目的 考虑一个问题:一组数据XP×NX...
  • @(笔记)两个点集间的变换矩阵(或相似矩阵)计算(应用于点云配准、图像匹配) 同尺度点云 问题描述:两个相同尺度的点云,仅发生旋转平移(R、T)变换,已知相互匹配点集的情况下,计算R、T。 void pose_estimation_...
  • PCL 点云镜像变换

    2022-05-13 11:00:44
    点云镜像变换的PCL代码实现
  • PCL库学习笔记——使用变换矩阵变换点云

    万次阅读 多人点赞 2018-07-09 13:15:10
    下面的代码通过两种方式生成了变换矩阵,并执行了变换及可视化。#include &lt;iostream&gt; #include &lt;pcl/io/pcd_io.h&gt; #include &lt;pcl/io/ply_io.h&gt; #include &lt;pcl/...
  • 本文介绍了MATLAB中的刚体变换矩阵和仿射变换矩阵
  • 今天小编就为大家分享一篇python 和c++实现旋转矩阵到欧拉角的变换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 矩阵转欧拉角的PCL实现
  • 详解坐标变换矩阵

    万次阅读 多人点赞 2021-12-27 22:54:28
    这是本人第一次在CSDN发文,本文详细总结坐标变换矩阵。 一、何为坐标变换矩阵 首先要回答一个问题,何为坐标变换矩阵呢?在以上所举例的坐标系变换的语境下, “点不变,坐标系进行变换。” 高中就接触到点的...
  • 结合点云统计学特性和形状特征, 提出了带方差补偿的多向仿射变换点云配准算法, 将求解放缩因子问题转化为求解带方差的超定非线性方程组, 并通过二次曲面拟合对噪声方差进行最小二乘无偏估计。引入点云全局向量特征...
  • Open3D 点云镜像变换

    2022-05-15 18:56:49
    点云镜像变换的open3d代码实现
  • matlab中点云变换矩阵的表示形式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,854
精华内容 2,341
关键字:

点云变换矩阵

友情链接: DFTFBP50.rar