基于PCL的ICP及其變種算法實現

文章目錄

  • 前言
  • 一、ICP算法基礎
    • 1.1 提取待匹配點對
    • 1.2 計算旋轉平移矩陣
    • 1.3 計算變換后的點和目標點之間的偏差
  • 二、ICP算法變種
    • 2.1 PLICP
    • 2.2 PointToPlane ICP
    • 2.3 NICP
    • 2.4 LM_ICP
  • 三、程序示例
    • 1. 傳統方法
    • 2. PointToPlane ICP
  • 總結


前言

ICP(Iterative Closest Point,最近鄰點迭代)是應用最廣泛的三維點云配準算法之一,網上講ICP算法原理的非常多,這里列舉幾個個人覺得講的比較好的。
三維點云配準 – ICP 算法原理及推導
ICP(迭代最近點)算法
PCL學習筆記二:Registration (ICP算法)

原始的ICP算法的問題在于點對之間只分析距離之間的關系從而引起迭代次數高,最終導致的計算時間過長,所以很多學者提出了各種各樣的改進算法,如:PLICP,PointToPlane ICP,NICP,LM_ICP算法等。
本文對各種ICP算法的原理以及其簡單的應用進行分析。


一、ICP算法基礎

ICP算法的基本邏輯是先通過對應關系估計、關鍵點檢測等方法找到源點云和目標點云的待匹配點對,然后計算旋轉和平移矩陣,對source點云進行旋轉平移到target點云上,根據設置的閾值進行判斷,如果不滿足閾值要求就重復以上過程繼續計算,最終達到最大迭代次數或者滿足設定的均方差閾值才能停止迭代。
可以用一個公式表示:
在這里插入圖片描述

1.1 提取待匹配點對

首先按需要進行blob。
然后進行Correspondences estimation(對應關系估計),得到共同部分的點云。

/** \brief A CorrespondenceEstimation object, used to estimate correspondences between the source and the target cloud. */CorrespondenceEstimationPtr correspondence_estimation_;/** \brief The minimum number of correspondences that the algorithm needs before attempting to estimate the * transformation. The default value is 3.*/int min_number_correspondences_;correspondence_estimation_->setInputTarget (target_);if (correspondence_estimation_->requiresTargetNormals ())correspondence_estimation_->setTargetNormals (target_blob);

具體源碼自行查看,下面列出Correspondences estimation的計算代碼,里面包含了兩種計算方法,分別為determineCorrespondences和determineReciprocalCorrespondences 。
determineCorrespondences會計算所有點的對應關系。
determineReciprocalCorrespondences計算兩個點云共同部分的對應關系。

最后進行一個CorrespondenceRejector,去除錯誤的估計。

 for (std::size_t i = 0; i < correspondence_rejectors_.size (); ++i){registration::CorrespondenceRejector::Ptr& rej = correspondence_rejectors_[i];if (rej->requiresTargetPoints ())rej->setTargetPoints (target_blob);if (rej->requiresTargetNormals () && target_has_normals_)rej->setTargetNormals (target_blob);}

1.2 計算旋轉平移矩陣

我們默認變換為剛性變換,通過空間中兩點間的變換關系計算R和T矩陣。假定第一次計算的矩陣為R0R_0R0?T0T_0T0?。PCL中ICP的初始矩陣為

Eigen::Vector4f pt (0.0f, 0.0f, 0.0f, 1.0f), pt_t;
Eigen::Matrix4f tr = transform.template cast<float> ()

也就是:
[1010101]\begin{bmatrix} 1&&&0\\ &1&&0\\&&1&0\\&&&1\end{bmatrix}?????1?1?1?0001??????
公式如下:
pip_ipi?=R0R_0R0?*qiq_iqi?+T0T_0T0?
其中:
在這里插入圖片描述
T = [txtytz]\begin{bmatrix} tx&ty&tz\end{bmatrix}[tx?ty?tz?]
具體的計算采用奇異值分解的方法,具體計算過程前言部分推薦的文章有寫。

1.3 計算變換后的點和目標點之間的偏差

對點集p進行變換,計算變換后的點集p1p_1p1?和q的距離值。
Distance=∑i=1n∣∣p1\displaystyle\sum_{i=1}^{n}||p_1i=1n?p1?-q ||2^22
Distance和設定的閾值進行對比,如果大于,則跳到第一步重新開始循環迭代,如果達到最大迭代次數還沒有滿足閾值要求,也會停止迭代,保留最近一次的迭代結果。
PCL中還有一個收斂條件設置setTransformationEpsilon,意思是上一個變換矩陣和當前變換矩陣的差異值,如果差異值小于閾值,也認為達到收斂。

PCL迭代部分的代碼如下:

 // Estimate the transformtransformation_estimation_->estimateRigidTransformation (*input_transformed, *target_, *correspondences_, transformation_);// Transform the datatransformCloud (*input_transformed, *input_transformed, transformation_);// Obtain the final transformationfinal_transformation_ = transformation_ * final_transformation_;++nr_iterations_;

二、ICP算法變種

因為計算點對間的最小距離的方法過于耗時和低效,所以出現了很多加速方法,例如先提取點云特征,然后進行特征間的匹配,可以極大減少匹配時間;或者對計算源點云中點到目標點云對應點線或者面的最小距離,可以降低。

2.1 PLICP

PLICP計算當前幀中的點到參考幀中最近鄰兩點連線的最小距離值,在slam中應用較多,可以或者更小的迭代次數和更高的精度。
原理可以參考論文:
A. Censi, “An ICP variant using a point-to-line metric,” 2008 IEEE International Conference on Robotics and Automation, Pasadena, CA, 2008, pp. 19-25, doi: 10.1109/ROBOT.2008.4543181

2.2 PointToPlane ICP

計算Source點云中點到目標點云對應點形成的面的最小距離值。
在這里插入圖片描述
這里ni為qi的法線,minE為最小歐式距離。

2.3 NICP

NICP與傳統ICP的不同之處在于NICP會多考慮曲率和法線的方向一致問題,如果對應點的曲率和法線方向超過設定閾值,不會建立對應點的匹配。所以在計算的時候需要計算點云的法線信息,然后進行匹配時需要額外對對應點對的法線和曲率限定閾值。

2.4 LM_ICP

LM_ICP在計算最小距離的時候采用LM模型來進行,算法原理可以查看論文:
結合Kinect的雙目視覺場景三維重建。

三、程序示例

1. 傳統方法

傳統方法計算全部點云的對應關系導致計算時間非常長。

icp.setInputSource(source); 
icp.setInputTarget(target);
icp.setTransformationEpsilon(1e-8);
icp.setMaxCorrespondenceDistance(1); //添加一個最大距離的閾值,超過最大距離的點不作為對應點。
icp.setEuclideanFitnessEpsilon(0.00005);
icp.setMaximumIterations(150);
icp.setUseReciprocalCorrespondences(true);

迭代1次:
在這里插入圖片描述
迭代134次:
在這里插入圖片描述

2. PointToPlane ICP

PointToPlane ICP的核心類是IterativeClosestPointWithNormals,默認情況下,此實現使用傳統的點對面目標,并使用目標點云的法線計算點對面距離。
另外在計算法線的時候采用OpenMP來進行多線程加速。

pcl::IterativeClosestPointWithNormals<pcl::PointNormal, pcl::PointNormal>ptoplane_icp;ptoplane_icp.setInputSource(source_with_normals);
ptoplane_icp.setInputTarget(target_with_normals);
ptoplane_icp.setTransformationEpsilon(1e-8);
ptoplane_icp.setMaxCorrespondenceDistance(1);
ptoplane_icp.setEuclideanFitnessEpsilon(0.0001); 
ptoplane_icp.setMaximumIterations(150); 

在這里插入圖片描述
在這里插入圖片描述
可見只進行了7次迭代,用時1.6s.


總結

ICP算法功能強大,算法種類也很多,在實際使用時需要根據實際應用場景開發適合的ICP自適應算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256077.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串&#xff08;Longest CommonSubstring&#xff09;和最長公共子序列&#xff08;LongestCommon Subsequence, LCS&#xff09;的區別&#xff1a;子串&#xff08;Substring&#xff09;是串的一個連續的部分&#xff0c;子序列&#xff08;Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個&#xff1a;①重新定義了一塊空間用于存儲數據&#xff1b;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中&#xff0c;程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的&#xff1a; public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣&#xff0c;是一種擬合數據的算法。區別在于mls是局部的&#xff0c;即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合&#xff0c;需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的&#xff0c;采用所…

二分法php

二分法。分別使用while循環的方法和遞歸調用的方法。 <?php// 二分法的使用數組必須是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 遞歸調用&#xff08;相比較好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A組集訓第7場11.4】推冰塊

題目描述 Dpstr最近迷上了推冰塊。冰地是一個n行m列的網格區域&#xff0c;第i行第j列的格子記為(i,j)&#xff0c;也就是左上角為(1,1)&#xff0c;右下角為(n,m)。每個格子可能是冰面、障礙物、減速帶三者之一。其中&#xff0c;冰地外圍&#xff08;即第0行、第n1行、第0列、…

【圖像處理面試題】——1

鏈接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、給定0-1矩陣&#xff0c;求連通域。2、寫一個函數&#xff0c;求灰度圖的直方圖。3、寫一個均值濾波&#xff08;中值濾波&#xff09;。4、寫出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT運維服務管理問題總結 #F#

1.管理現狀問題&#xff1a;支撐企業業務運行的IT系統主要由大量的網絡設備、主機系統和應用系統組成&#xff0c;這些設備和系統從應用角度來分又屬于不同的業務系統和部門&#xff0c;網絡設備、主機系統等具備獨立的用戶管理、認證授權和審計系統&#xff0c;且由不同的系統…

基于PCL的RANSAC(隨機采樣一致)算法簡介與示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;隨機采樣一致&#xff09;是3D點云擬合的一種重要的手段&#xff0c;可以對直線、圓、平面&#xff0c;圓球、圓柱等形狀的點云進行擬合&#xff0c;其優點在于可以最大程度上減少噪聲點對擬合效果的影響。 一、RA…

MATLAB調用Python自定義函數(類、函數等) Python調用MATLAB

一、MATLAB調用Python函數 參考鏈接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎鏈接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上這位說的更加的詳細&#xff0c;感謝 二、Python調用MATLAB-API 知乎鏈接&#xff1a;htt…

Testin云測與ARM 戰略合作:推動全球移動應用加速進入中國市場

Testin云測與ARM 戰略合作&#xff1a;推動全球移動應用加速進入中國市場 2014/10/14 Testin 業界資訊&#xff08;中國北京–2014年10月14日 &#xff09;全球最大的移動游戲、應用真機和用戶云測試平臺Testin云測今日宣布與ARM建立戰略伙伴合作關系&#xff0c;設立“ARM應…

iOS:真機調試

真機調試現在發生了改變&#xff0c;在Xcode7以前進行真機調試是需要證書的&#xff0c;正是由于這個原因&#xff0c;這個過程比較麻煩&#xff1b;在Xcode7以后是免證書的&#xff0c;使用起來就簡單很多了。 Xcode7以前的步驟如下&#xff1a; 原鏈接地址為&#xff1a;http…

正則表達式快速入門,轉載

正則表達式快速入門 首先簡單介紹下正則表達式&#xff1a; 在編寫處理字符串的程序或網頁時&#xff0c;經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具。換句話說&#xff0c;正則表達式就是記錄文本規則的代碼。 下面就看看正則表達式里…

C++總結筆記(十三)—— 類型轉換

文章目錄一、類型轉換簡介二、示例1.隱式類型轉換2.強制類型轉換一、類型轉換簡介 C中類型轉換從形式上可分為顯式和隱式兩種。 隱式類型轉換則是由編譯器自動完成類型轉換過程&#xff0c;可以分為內置數據類型轉換和自定義數據類型轉換。 顯式的類型轉換通常使用強制類型轉…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件轉py文件及no Qt platform plugin could be initialized 問題解決】

目錄 一、尋找designer.exe 二、no Qt platform plugin could be initialized 問題解決 三、ui文件轉換為py文件 四、pyqt5的使用教程 一、尋找designer.exe 頭疼&#xff0c;找了一上午都沒有找到這個的路徑&#xff0c;最后還是在評論區看到的&#xff0c;這也不能怪人家…

mysql語句大全

1、說明&#xff1a;創建數據庫CREATE DATABASE database-name2、說明&#xff1a;刪除數據庫drop database dbname3、說明&#xff1a;備份sql server--- 創建 備份數據的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 開始 備份B…

【翻譯】在Ext JS和Sencha Touch中創建自己定義布局

原文&#xff1a;Creating Custom Layouts in Ext JS and Sencha Touch布局系統是Sencha框架中最強大和最獨特的一部分。布局會處理應用程序中每個組件的大小和位置&#xff0c;因而&#xff0c;不須要手動去管理那些碎片。Ext JS與Sencha Touch的布局類有很多類似之處。近期在…

PCL中GreedyProjection三角化算法簡介與示例

文章目錄前言一、PCL點云三角化1.1 Delaunay三角剖分1.2 貪婪三角化二、程序示例總結前言 Delaunay三角剖分最初應用于2維領域&#xff0c;而與Greedy三角化算法的結合&#xff0c;使之成為目前在三維重建領域最為基礎的算法原理之一&#xff0c;很多學者針對其原理進行改進用…

[設計模式]中介者模式之Events消息傳遞實現

這篇文章比較短,修改自 寫給大家看的設計模式之中介者中的例子中介者模式的定義和目的自不必說, 參考上文即可. 本文針對實現方式做一個補充. 中介者模式增加了一個第三方對象(中介者)來控制兩個對象(同事)間的交互. 有助于對彼此通信的解耦, 畢竟他們并不需要關心對方的實現細…