两个3D点云变换矩阵

2024-03-25

我试图猜测两个 3D 点云之间的刚性变换矩阵是哪个。 这两个点云是:

  • 来自 kinect 的关键点 (kinect_keypoints)。
  • 来自 3D 对象(盒子)的关键点 (object_keypoints)。

我尝试过两种选择:

[1]。实现寻找刚性变换的算法。

**1.Calculate the centroid of each point cloud.**

**2.Center the points according to the centroid.**

**3. Calculate the covariance matrix**
cvSVD( &_H, _W, _U, _V,  CV_SVD_U_T );
cvMatMul( _V,_U, &_R );
**4. Calculate the rotartion matrix using the SVD descomposition of the covariance matrix**

float _Tsrc[16] = { 1.f,0.f,0.f,0.f,
    0.f,1.f,0.f,0.f,
    0.f,0.f,1.f,0.f,
    -_gc_src.x,-_gc_src.y,-_gc_src.z,1.f };  // 1: src points to the origin
float _S[16] = { _scale,0.f,0.f,0.f,
    0.f,_scale,0.f,0.f,
    0.f,0.f,_scale,0.f,
    0.f,0.f,0.f,1.f };  // 2: scale the src points
float _R_src_to_dst[16] = { _Rdata[0],_Rdata[3],_Rdata[6],0.f, 
    _Rdata[1],_Rdata[4],_Rdata[7],0.f,
    _Rdata[2],_Rdata[5],_Rdata[8],0.f,
    0.f,0.f,0.f,1.f }; // 3: rotate the scr points
float _Tdst[16] = { 1.f,0.f,0.f,0.f, 
    0.f,1.f,0.f,0.f, 
    0.f,0.f,1.f,0.f, 
    _gc_dst.x,_gc_dst.y,_gc_dst.z,1.f }; // 4: from scr to dst

// _Tdst * _R_src_to_dst * _S * _Tsrc
mul_transform_mat( _S, _Tsrc, Rt );
mul_transform_mat( _R_src_to_dst, Rt, Rt );
mul_transform_mat( _Tdst, Rt, Rt );       

[2]。使用 opencv 中的estimateAffine3D。

        float _poseTrans[12];
        std::vector<cv::Point3f> first, second;             
        cv::Mat aff(3,4,CV_64F, _poseTrans);
        std::vector<cv::Point3f> first, second; (first-->kineckt_keypoints and second-->object_keypoints)
        cv::estimateAffine3D( first, second, aff, inliers );

        float _poseTrans2[16];

        for (int i=0; i<12; ++i)
        {
            _poseTrans2[i] = _poseTrans[i];
        }

        _poseTrans2[12] = 0.f;
        _poseTrans2[13] = 0.f;
        _poseTrans2[14] = 0.f;
        _poseTrans2[15] = 1.f;

第一个中的问题是变换不正确,而在第二个中,如果将 kinect 点云与结果矩阵相乘,则某些值是无限的。

这些选项中有任何解决方案吗?或者除了 PCL 之外还有其他选择吗?

先感谢您。


编辑:这是一篇旧帖子,但答案可能对某人有用......

您的第一种方法可以在非常特殊的情况下工作(椭圆体点云或非常细长的形状),但不适合 kinect 获取的点云。关于你的第二种方法,我不熟悉OpenCV功能estimateAffine3D但我怀疑它假设两个输入点云对应于相同的物理点,如果您使用 kinect 点云(包含噪声测量值)和来自理想 3D 模型的点(完美的),则情况并非如此。

您提到您知道点云库(PCL)但不想使用它。如果可能的话,我想你可能想重新考虑这一点,因为 PCL 比 OpenCV 更适合你想做的事情(检查教程列表,其中之一涵盖exactly你想要做什么:将对象模板与点云对齐)。

但是,这里有一些针对您的问题的替代解决方案:

  1. 如果您的两个点云完全对应于相同的物理点,则您的第二种方法应该有效,但您也可以查看绝对方向(例如Matlab实现 http://www.mathworks.fr/matlabcentral/fileexchange/22422-absolute-orientation)

  2. 如果您的两个点云不对应于相同的物理点,您实际上想要注册(或对齐)它们,您可以使用以下任一方法:

    • 迭代最近点 (ICP) 算法的众多变体之一(如果您大致知道对象的位置)。维基百科条目 http://en.wikipedia.org/wiki/Iterative_closest_point

    • 如果您不知道对象的位置,则可以使用 3D SIFT、3D SURF 或 NARF 特征点等 3D 特征点。

同样,所有这些方法都已在 PCL 中实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个3D点云变换矩阵 的相关文章

  • 如何修复 scanf 将数据放入数组中?

    有人可以就 scanf 提出建议吗 message 是一个 4 行 x 16 列的数组 用户输入数字 全部为 1 位整数 后 按 Enter 键时会出现错误消息 正如所说 可能与 scanf 有关 for int i 0 i lt M i
  • 用 C 语言制作查找表的最佳方法是什么?

    我正在开发一个嵌入式 C 项目 我有一个 LCD 显示屏 每个字符都有一个 5x7 点阵 要显示特定字符 您必须移动与要打开的点相关的 5 个字节 所以我需要制作某种带有键的查找表 我可以在其中传递 ASCII 字符 并返回一个 5 字节的
  • 使 minGW 控制台程序在没有控制台的情况下运行

    我在 MinGW 中制作了一个控制台程序 它执行网络和文件操作 然而 它是一个控制台程序 如何让它安静地运行 没有控制台 没有窗口 尝试这个 ShowWindow GetConsoleWindowHandle SW HIDE GetCons
  • 使用参数将数据插入access数据库

    我有以下方法将数据插入到访问数据库中 该方法工作正常 但如果我尝试插入包含我学到的单引号的文本 我确实会遇到问题 WebMethod public void bookRatedAdd string title int rating stri
  • 解决方案将无法构建,因为它无法从服务生成的类型转换为我的类型

    我有一个 WCF 服务项目 它构建得很好 可以生成可访问的 WSDL 并且 svcutil exe 不会生成任何错误 我有一个访问该 Web 服务的 服务管理器 项目 并且我已成功向其中添加了服务引用 ABCService 第三个项目包含我
  • 如何在 Google 日历中创建“recurData”?

    我想使用 Google API 创建日历的重复事件 我正在关注链接 谷歌日历API http code google com apis calendar data 2 0 developers guide dotnet html Creat
  • 如何修改道路网络的 L 系统?

    向大家问好 我目前正在研究道路网络的程序生成 并偶然发现了 L 系统算法 根据我从有关该主题的各种科学论文以及有关该主题的论文的进一步论文中了解到 算法更改为使用 全局目标和局部约束 其中修改所采取的路径以适应地形等输入值和人口密度 现在我
  • 阅读 C 语言中的科学记数法

    我正在尝试读取包含以下内容的文件 1 0000000e 01 2 9265380e 03 5 0821200e 02 4 3231640e 01 2 0000000e 01 1 0170240e 04 9 2798610e 02 4 072
  • 从 C 调用带有字符串参数的 Go 函数?

    我可以从 C 调用一个没有参数的 Go 函数 按照下面的 https github com joeprivacy crefgo hello world 这通过编译go build和打印 Hello from Golang main func
  • 无法使用 process.ErrorDataReceived c# 获取进程错误输出

    我已经建立了Form我使用了一段时间的应用程序 现在我想捕捉StandardError我的流程及其standartOutput 我查看了答案SO and MSDN https msdn microsoft com en us library
  • C++ 中“return *this”是什么意思?

    我正在将 C 程序转换为 C 但这部分让我感到困惑 return this 是什么意思 template lt EDemoCommands msgType typename PB OBJECT TYPE gt class CDemoMess
  • 如何以编程方式区分不同的 IOException?

    我正在对写入 Process 对象的 StandardInput 流的代码进行一些异常处理 Process 有点像 unix head 命令 它只读取输入流的一部分 当进程终止时 写入线程会失败并显示 IOException The pip
  • 可变长度数组性能影响 (C/C++)

    我正在编写一个相当简单的函数 它将数组发送到文件描述符 但是 为了发送数据 我需要附加一个一字节标头 这是我正在做的事情的简化版本 它似乎有效 void SendData uint8 t buffer size t length uint8
  • 如何在 C# 中获取包含表情符号的字符串的正确长度

    The 英语国旗表情符号 https emojipedia org flag for england 由 14 个字节的数据组成 组合后将呈现一个字符 如果我有如下所示的代码 var test ud83c udff4 udb40 udc67
  • LINQ 表达式树 Any() 位于Where() 内

    我正在尝试生成以下 LINQ 查询 Query the database for all AdAccountAlerts that haven t had notifications sent out Then get the entity
  • 如何在 if () 语句中声明变量? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 的条件或控制语句中声明和初始化变量 https stackoverflow com questions 1516919 declaring and initializing a variabl
  • 将 tiff 像素长宽比更改为正方形

    我正在尝试对多页 tiff 文件执行条形码识别 但是 tiff 文件是从传真服务器 我无法控制 发送给我的 该服务器以非方形像素长宽比保存 tiff 这导致图像由于纵横比而被严重挤压 我需要将 tiff 转换为方形像素长宽比 但不知道如何在
  • Security.h 中结构的 macOS 文档

    我正在尝试使用Security h通过 Java 和 JNA 的 macOS 框架 这意味着我需要将某些结构重建为 Java 类 问题是 当我查看文档中的结构时 this one https developer apple com refe
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更
  • 为什么 typeof 函数在 C 中不起作用

    我使用GCC编译器 版本9 2 0 我想在 C 中使用 typeof 函数 但它会引发错误 错误 typeof 之前的预期表达式 如果您需要更多信息 请询问我 int a 5 double b the expected result is

随机推荐

  • 为什么对 Deref::deref 结果断言会因类型不匹配而失败?

    以下是Deref示例来自Rust 编程语言 https doc rust lang org book first edition deref coercions html除了我添加了另一个断言 为什么assert eq与deref也相等 a
  • 如何在nodeJS项目中使用Jest全局Setup和Teardown?

    我使用 jest 将测试添加到我的 Node js 项目中 但对于每个测试套件 都有一个 beforeAll 方法用于创建新的测试服务器并连接到 mongo 数据库 还有一个 afterAll 方法用于关闭测试服务器和数据库 我想对所有测试
  • AWS DocumentDB 与 Robo 3T (Robomongo)

    我想将 Mac 笔记本电脑上的 Robo 3T 以前称为 robomongo 与 AWS 的 DocumentDB 连接 我遵循了大量教程 但找不到任何特定于 DocumentDB 的教程 在测试阶段 它通过了步骤 1 连接到我的 EC2
  • INSTALL_FAILED_OLDER_SDK 的 minSdkVersion 低于设备 API 版本

    在全新安装最新的 AndroidStudio 时 运行新项目模板 最小 SDK 选择为 15 ICS 尝试在运行 API 19 的 Nexus 5 上运行 我收到 INSTALL FAILED OLDER SDK 错误并显示以下输出 我没有
  • 类型不匹配:无法从连接转换为连接

    我想要 JDBC 连接到 MS Access 但 Class forName sun jdbc odbc JdbcOdbcDriver Connection con DriverManager getConnection jdbc odbc
  • 如何在 Room 中插入具有一对多关系的实体

    我正在使用 Room 构建一个数据库 但我不知道如何将具有关系 在我的例子中是一对多 的新元素插入到数据库中 没有解决方案曾经讨论过插入 他们只讨论了查询数据 这是 DAO Dao abstract class ShoppingListsD
  • 在WPF中,为什么MouseLeave触发而不是MouseDown?

    这是我的代码
  • 这个特权准则有什么问题吗?

    如何检查 检查 php代码或页面中的权限 我使用爆炸和 in array 用户登录并进入 检查 页面后 代码必须检查用户的权限是否具有 dataDisplay 权限 但 检查 页面中的代码不会执行此操作 我的 检查 页面代码有什么问题 这是
  • Windows10 上使用 VirtualBox 的 Vagrant:在您的 PATH 中找不到“Rsync”

    我在 Windows 7 系统上使用 Vagrant 一段时间了 现在我有一台装有 Windows 10 的新 PC 我安装了 Oracle Virtual Box 和 Vagrant 并尝试使用命令 vagrant up 启动计算机 Va
  • r 中的 ifelse 匹配向量

    我有一个如下所示的数据框 gt df lt data frame A c NA 1 2 3 4 B c NA 5 2 6 4 C c NA NA 2 NA NA gt df A B C 1 NA NA NA 2 1 5 NA 3 2 2 2
  • C/C++ 的多线程内存分配器

    我目前有大量的多线程服务器应用程序 并且我正在寻找一个好的多线程内存分配器 到目前为止 我在以下两点之间左右为难 太阳乌梅 谷歌的tcmalloc 英特尔的线程构建块分配器 埃默里 伯杰的宝藏 据我所知 hoard 可能是最快的 但我在今天
  • 为什么冒泡排序最好情况的时间复杂度是O(n)

    我按照书中使用的方法推导了冒泡排序在最佳情况下的时间复杂度算法2 2 但结果是 O n 2 以下是我的推导 希望大家帮我找出哪里错了 public void bubbleSort int arr for int i 0 len arr le
  • 让 Kotlin 序列化器与 Retrofit 配合使用

    我无法让 Kotlin Serializer 与 Retrofit 一起使用 我在用com jakewharton retrofit retrofit2 kotlinx serialization converter 0 5 0与 Retr
  • 如何用networkx绘制社区

    如何使用 python networkx 绘制其社区的图表 如下图所示 图片网址 https data graphstream project org talks CSSS2012 media Community Structure2 jp
  • Pentaho Data Integration(最新版本)-未检测到 MySQL 驱动程序

    我是这个工具的新手 我正在尝试创建与数据库的 MySQL 连接 但是当我按下 测试 按钮时 它会显示以下消息 Error connecting to database MySQL configuracionesEF org pentaho
  • 将 UITableView 作为容器视图嵌入到 UIViewController 中

    我想添加一个文本字段和发送按钮 该按钮粘贴在 uitableview 的底部 类似于聊天应用程序 我遇到过关于将 UITableView 作为容器视图嵌入到 UIViewController 中的评论 然而 他们似乎缺乏如何实现这一目标的例
  • 自应用签名后文档已被更改或损坏 itext 5.5.11

    基本上 我收到错误 自应用签名以来文档已被更改或损坏 我按照 itext 网站的示例并根据我的情况进行了调整 准备好要签名的文档 添加append模式 因为可以 已经签署的文件 调用 Web 服务来签署哈希值 将签名哈希添加到准备好的文档中
  • 如何在 Django 中验证电子邮件地址? [复制]

    这个问题在这里已经有答案了 我编写了一个用于将电子邮件添加到时事通讯库的函数 在我添加检查发送电子邮件的有效性之前 它一直运行得很好 现在每次我都会收到 错误的电子邮件 回复 有人能看到这里有任何错误吗 使用的正则表达式是 b w w w
  • 在 Pandas DataFrame 中拆分列列表

    我正在寻找解决以下问题的好方法 我当前的修复不是特别干净 我希望从您的见解中学习 假设我有一个 Panda DataFrame 其条目如下所示 gt gt gt df pd DataFrame index 1 2 3 columns Col
  • 两个3D点云变换矩阵

    我试图猜测两个 3D 点云之间的刚性变换矩阵是哪个 这两个点云是 来自 kinect 的关键点 kinect keypoints 来自 3D 对象 盒子 的关键点 object keypoints 我尝试过两种选择 1 实现寻找刚性变换的算