Python-open3d点云配准

2024-06-01 1333阅读

文章目录

    • ICP算法
    • 鲁棒核
    • ICP测试

      ICP算法

      ICP, 即Iterative Closest Point, 迭代点算法。

      ICP算法有多种形式,其中最简单的思路就是比较点与点之间的距离,对于点云 P = { p i } , Q = { q i } P=\{p_i\}, Q=\{q_i\} P={pi​},Q={qi​}而言,如果二者是同一目标,通过旋转、平移等操作可以实现重合的话,那么只需要固定 Q Q Q而不断地旋转或平移 P P P,最终二者一定能最完美地重合。

      设 R , t R, t R,t分别为旋转矩阵和平移矩阵,在完美匹配的情况下,必有 q i = R p i + t q_i = Rp_i + t qi​=Rpi​+t。但三维点云不具备栅格特征,故而很难保证 q i q_i qi​和 p i p_i pi​一一对应,所以求解问题变为优化问题,目标函数为

      arg min ⁡ R , t 1 2 ∑ i = 1 n ∥ q i − R p i − t ∥ 2 \argmin_{R,t}\frac{1}{2}\sum^n_{i=1}\Vert q_i-Rp_i-t\Vert^2 R,targmin​21​i=1∑n​∥qi​−Rpi​−t∥2

      1992年Chen和Medioni对此方案进行了改进,提出了点对面的预估方法,其目标函数为

      arg min ⁡ R , t 1 2 ∑ i = 1 n [ ( q i − R p i ) ⋅ n p ] 2 \argmin_{R,t}\frac{1}{2}\sum^n_{i=1}[(q_i-Rp_i)\cdot n_p]^2 R,targmin​21​i=1∑n​[(qi​−Rpi​)⋅np​]2

      其中 n p n_p np​是点 p p p的法线,这种方案显然效率更高。

      在使用ICP算法前后,两个点云的叠加图像变化如下

      Python-open3d点云配准

      基于Open3d实现的代码如下

      import numpy as np
      import open3d as o3d
      pipreg = o3d.pipelines.registration
      pcd = o3d.data.DemoICPPointClouds()
      src = o3d.io.read_point_cloud(pcd.paths[0])
      tar = o3d.io.read_point_cloud(pcd.paths[1])
      th = 0.02
      trans_init = np.array([
          [0.862, 0.011, -0.507, 0.5], [-0.139, 0.967, -0.215, 0.7],
          [0.487, 0.255, 0.835, -1.4], [0.0, 0.0, 0.0, 1.0]])
      reg = pipreg.registration_icp(
          src, tar, th, trans_init,
          pipreg.TransformationEstimationPointToPoint())
      print(reg.transformation)   # 变换矩阵
      print(reg)  # 表示点云配准的拟合程度
      '''
      fitness=3.724495e-01, inlier_rmse=7.760179e-03, and correspondence_set size of 74056 Access transformation to get result.
      '''
      

      【registration_icp】即为open3d实现的点云配准函数,在示例中,输入的5个参数分别为点云 P P P、目标点云 Q Q Q、同名点未匹配时的最大距离、初始变化矩阵、变换方法。

      【TransformationEstimationPointToPoint】即点对点的目标函数。

      匹配完成后,打印的变换矩阵为

      [ 0.83924644 0.01006041 − 0.54390867 0.64639961 − 0.15102344 0.96521988 − 0.21491604 0.75166079 0.52191123 0.2616952 0.81146378 − 1.50303533 0. 0. 0. 1. ] ] \begin{bmatrix} 0.83924644&0.01006041&-0.54390867&0.64639961\\ -0.15102344&0.96521988&-0.21491604&0.75166079\\ 0.52191123&0.2616952& 0.81146378&-1.50303533\\ 0.& 0.&0.&1. ]\\ \end{bmatrix} ​0.83924644−0.151023440.521911230.​0.010060410.965219880.26169520.​−0.54390867−0.214916040.811463780.​0.646399610.75166079−1.503035331.]​ ​

      绘图代码如下

      from copy import deepcopy
      srcDraw = deepcopy(src)
      tarDraw = deepcopy(tar)
      srcDraw.paint_uniform_color([1, 1, 0])
      tarDraw.paint_uniform_color([0, 1, 1])
      srcDrawICP = deepcopy(src)
      tarDrawICP = deepcopy(tarDraw)
      srcDrawICP.transform(reg.transformation)
      geo = [srcDraw, tarDraw,
             srcDrawICP.translate((4.5, 0, 0)),
             tarDrawICP.translate((4.5, 0, 0))]
      o3d.visualization.draw_geometries(geo)
      

      鲁棒核

      现有点云 P , Q P,Q P,Q,若二者存在一一对应的点列 p i ∈ P , q i ∈ Q p_i\in P, q_i\in Q pi​∈P,qi​∈Q,通过对 Q Q Q进行矩阵变换 T T T,以期二者完全配准,那么对于第 i i i个点而言,记 r i ( T ) = ( p i − T q i ) ⋅ n p i r_i(T)=(p_i-Tq_i)\cdot n_{p_i} ri​(T)=(pi​−Tqi​)⋅npi​​, n p i n_{p_i} npi​​为点 p i p_i pi​的法向量,即 q i q_i qi​在经过矩阵变换后与 p i p_i pi​在其法向量方向的残差。

      则点对面ICP的目的,就是让下面的函数取值最小

      E ( T ) = ∑ i = 1 N r i ( T ) 2 E(T)=\sum_{i=1}^Nr_i(T)^2 E(T)=i=1∑N​ri​(T)2

      在这个优化问题中, r i r_i ri​的作用举足轻重,任何对 r i r_i ri​的形式上的更改,都会直接影响优化结果,例如将这个优化问题改写成重复加权最小二乘法的形式

      E ( T ) = ∑ i = 1 N w i r i ( T ) 2 E(T)=\sum_{i=1}^Nw_ir_i(T)^2 E(T)=i=1∑N​wi​ri​(T)2

      让 r i r_i ri​乘上一个权重,那么在具体匹配的过程中,就可以降低某些特殊值的影响。如果这个权重本身就是 r i r_i ri​的函数,那么加权过程可以写成更加抽象的形式

      E ( T ) = ∑ i = 1 N ρ [ r i ( T ) ] E(T)=\sum_{i=1}^N\rho[r_i(T)] E(T)=i=1∑N​ρ[ri​(T)]

      ρ \rho ρ可称为Robust核函数,open3d中封装了如下和函数

      核函数封装
      L1损失L1Loss ω ( r ) = 1 ∣ r ∣ → ρ ( r ) = ∣ r ∣ \omega(r)=\frac1{\vert r\vert }\to\rho(r)=\vert r\vert ω(r)=∣r∣1​→ρ(r)=∣r∣
      L2损失L2Loss ω ( r ) = 1 → ρ ( r ) = r 2 2 \omega(r)=1\to\rho(r)=\frac{r^2}2 ω(r)=1→ρ(r)=2r2​
      柯西核CauchyLoss ω ( r ) = 1 1 + ( r k ) 2 → ρ ( r ) = k 2 2 log ⁡ ( 1 + ( r k ) 2 ) \omega(r)=\frac1{1+(\frac r k)^2}\to \rho(r)=\frac{k^2}{2}\log(1+(\frac r k)^2) ω(r)=1+(kr​)21​→ρ(r)=2k2​log(1+(kr​)2)
      GM核GMLoss ω ( r ) = k ( k + r 2 ) 2 → ρ ( r ) = r 2 / 2 k + r 2 \omega(r)=\frac{k}{(k+r^2)^2}\to\rho(r)=\frac{r^2/2}{k+r^2} ω(r)=(k+r2)2k​→ρ(r)=k+r2r2/2​
      Huber核HuberLoss
      Tukey核TukeyLoss

      Huber核以及Tukey核相对复杂,表示如下

      • Huber核

        ω ( r ) = { 1 ∣ r ∣ ⩽ k k ∣ r ∣ otherwise ⁡ → ρ ( r ) = { r 2 2 ∣ r ∣

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]