草庐IT

python - 计算两组点之间的 3D 变换

coder 2023-08-25 原文

我正在使用 Microsoft Kinect 收集有关对象的深度数据。根据这些数据,我创建了点“云”(点云),在绘制时,我可以查看使用 Kinect 扫描的对象。

但是,我希望能够从不同的“ View ”收集多个点云并将它们对齐。更具体地说,我想使用类似 Iterative Closest Point (ICP) 的算法。为此,通过计算我收集的每个云与之前收集的云之间的旋转和平移来转换我的点云中的每个点。

但是,虽然我了解 ICP 背后的过程,但我不明白如何在 3D 中实现它。也许是我数学经验不足,或者是我对OpenCV等框架的经验不足,但我找不到解决方案。我想避免像点云库这样的库为我做这种事情,因为我想自己做。

感谢任何和所有建议(如果有涉及 OpenCV/python 的解决方案我可以处理,那就更好了!)

最佳答案

我目前正在与 ICP 作斗争。以下是我目前收集到的信息:

ICP 包括三个步骤:

  • 给定两个点云 A 和 B,找到 A 和 B 之间可能代表空间中相同点的点对。这通常只需将每个点与其在另一个云中的最近邻居进行匹配即可完成,但您可以使用颜色、纹理或表面法线等其他特征来改进匹配。然后,您可以选择丢弃最差的匹配项。
  • 给定这个对应对列表,找到从 A 到 B 的最优转换
  • 将此转换应用于 A 中的所有点
  • 重复这三个步骤,直到找到可接受的解决方案。

第一步很简单,虽然有很多方法可以优化它的速度,因为这是ICP的主要性能瓶颈;并提高准确性,因为这是错误的主要来源。 OpenCV 可以帮助您解决 FLANN library .

我假设您的问题在于第二步,即在给定对应关系列表的情况下找到最佳转换。

一种常见的方法适用于 Singular Value Decomposition (SVD) .这是该算法的粗略草图。搜索 ICP & SVD 会给出很多进一步的引用。

  • 取对应点列表A1..An和B1..Bn从第 1 步开始
  • 计算A中所有点的质心Ca和B中所有点的质心Cb
  • 计算 3x3 协方差矩阵 M
    M = (A1 - Ca)* (B1 - Cb)T + ... + (An - Ca)* (Bn - Cb )T
  • 使用 SVD 计算 M 的 3x3 矩阵 U 和 V
    (OpenCV 有一个 function to perform SVD )
  • 计算 R = U * VT
    这是您想要的最佳旋转矩阵。
  • 计算最佳翻译为 Cb - R*Ca
  • 最佳转换是R和这个翻译的结合

请注意,我自己还没有实现这个算法,所以我只是解释一下我读到的内容。

关于python - 计算两组点之间的 3D 变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20528094/

有关python - 计算两组点之间的 3D 变换的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  5. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐