ICP演算法實現 - 程式前沿
文章推薦指數: 80 %
ICP(Iterative Closest Point),即最近點迭代演算法,是最為經典的資料配 ... ICP演算法採用最小二乘估計計算變換矩陣,原理簡單且具有較好的精度, ...
程式語言前端開發IOS開發Android開發雲端運算人工智慧伺服器搜尋資料庫軟體開發工具ICP演算法實現2018.07.27程式語言ICP,icp原理,icp查詢介面,icp證書,icp迭代演算法,PCL ,點雲配準HOME程式語言ICP演算法實現Advertisement—————————-【轉自:SimpleTriangle】————————————-目錄0.1.ICP是什麼?0.2.PCLICP0.3.具體程式碼實現0.4.例項練習1.ICP之變種ICP是什麼?ICP(IterativeClosestPoint),即最近點迭代演算法,是最為經典的資料配准演算法。
其特徵在於,通過求取源點雲和目標點雲之間的對應點對,基於對應點對構造旋轉平移矩陣,並利用所求矩陣,將源點雲變換到目標點雲的座標系下,估計變換後源點雲與目標點雲的誤差函式,若誤差函式值大於閥值,則迭代進行上述運算直到滿足給定的誤差要求.ICP演算法採用最小二乘估計計算變換矩陣,原理簡單且具有較好的精度,但是由於採用了迭代計算,導致演算法計算速度較慢,而且採用ICP進行配準計算時,其對待配準點雲的初始位置有一定要求,若所選初始位置不合理,則會導致演算法陷入區域性最優。
PCLICPPCL點雲庫已經實現了多種點雲配准演算法,結合pcl,本次配準的主要目的是:對PCL中ICP演算法進行一些註解建立視覺化視窗,通過設定鍵盤迴調函式,控制迭代過程,觀察ICP演算法的計算過程PCL中ICP的官方參考文件http://pointclouds.org/docume…具體程式碼實現首先看一下pcl中ICP的主要程式碼:pcl::IterativeClosestPoint<:pointxyz>icp;//建立ICP的例項類
icp.setInputSource(cloud_sources);
icp.setInputTarget(cloud_target);
icp.setMaxCorrespondenceDistance(100);
icp.setTransformationEpsilon(1e-10);
icp.setEuclideanFitnessEpsilon(0.001);
icp.setMaximumIterations(100);
icc.align(final);需要說明的是:其一:PCL中的ICP演算法是基於SVD(SingularValueDecomposition)實現的.其二:使用pcl的ICP之前要set幾個引數:1.setMaximumIterations,最大迭代次數,icp是一個迭代的方法,最多迭代這些次(若結合視覺化並逐次顯示,可將次數設定為1);
2.setEuclideanFitnessEpsilon,設定收斂條件是均方誤差和小於閾值,停止迭代;
3.setTransformtionEpsilon,設定兩次變化矩陣之間的差值(一般設定為1e-10即可);
4.setMaxCorrespondenaceDistance,設定對應點對之間的最大距離(此值對配準結果影響較大)。
如果僅僅執行上述程式碼,並設定合理的的預估計引數,便可實現利用ICP對點雲資料進行配準計算.其次為了更深入的瞭解ICP的計算過程,即本試驗的第二個目的,繼續新增以下程式碼:boost::shared_ptr<:visualization::pclvisualizer>view(newpcl::visualization::PCLVisualizer("icptest"));//定義視窗共享指標
intv1;//定義兩個視窗v1,v2,視窗v1用來顯示初始位置,v2用以顯示配準過程
intv2;
view->createViewPort(0.0,0.0,0.5,1.0,v1);//四個視窗引數分別對應x_min,y_min,x_max.y_max.
view->createViewPort(0.5,0.0,1.0,1.0,v2);
pcl::visualization::PointCloudColorHandlerCustom<:pointxyz>sources_cloud_color(cloud_in,250,0,0);//設定源點雲的顏色為紅色
view->addPointCloud(cloud_in,sources_cloud_color,"sources_cloud_v1",v1);
pcl::visualization::PointCloudColorHandlerCustom<:pointxyz>target_cloud_color(cloud_target,0,250,0);//目標點云為綠色
view->addPointCloud(cloud_target,target_cloud_color,"target_cloud_v1",v1);//將點雲新增到v1視窗
view->setBackgroundColor(0.0,0.05,0.05,v1);//設著兩個視窗的背景色
view->setBackgroundColor(0.05,0.05,0.05,v2);
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"sources_cloud_v1");//設定顯示點的大小
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"target_cloud_v1");
pcl::visualization::PointCloudColorHandlerCustom<:pointxyz>aligend_cloud_color(Final,255,255,255);//設定配準結果為白色
view->addPointCloud(Final,aligend_cloud_color,"aligend_cloud_v2",v2);
view->addPointCloud(cloud_target,target_cloud_color,"target_cloud_v2",v2);
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"aligend_cloud_v2");
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"target_cloud_v2");
view->registerKeyboardCallback(&keyboardEvent,(void*)NULL);//設定鍵盤迴調函式
intiterations=0;//迭代次數
while(!view->wasStopped())
{
view->spinOnce();//執行檢視
if(next_iteration)
{
icp.align(*Final);//icp計算
cout<updatePointCloud(Final,aligend_cloud_color,"aligend_cloud_v2");
}
next_iteration=false;//本次迭代結束,等待觸發
}最後還需要設定以下鍵盤迴調函式,用以控制迭代程序:boolnext_iteration=false;
//設定鍵盤互動函式
voidkeyboardEvent(constpcl::visualization::KeyboardEvent&event,void*nothing)
{
if(event.getKeySym()=="space"&&event.keyDown())
next_iteration=true;
}
/*...上述函式表示當鍵盤空格鍵按下時,才可執行ICP計算...*/例項練習將上述程式碼組合,新增相應標頭檔案:#include
例項展示:ICP之變種ICP有很多變種,有point-to-point的,也有point-to-plane的,一般後者的計算速度快一些,是基於法向量的,需要輸入資料有較好的法向量,具體使用時建議根據自己的需要及可用的輸入資料選擇具體方法。
pcl::GeneralizedIterativeClosestPoint
近期文章Vue中容易被忽視的知識點2019.12.09if我是前端Leader,談談前端框架體系建設2019.12.09Spark入門(一)用SparkShell初嘗Spark滋味2019.12.08Spark入門(二)如何用Idea運行我們的Spark項目2019.12.08Spark入門(三)Spark經典的單詞統計2019.12.08Spark入門(四)Spark的map、flatMap、mapToPair2019.12.08Spark入門(五)Spark的reduce和reduceByKey2019.12.08Spark入門(六)Spark的combineByKey、sortBykey2019.12.08Spark入門(七)Spark的intersection、subtract、union和distinct2019.12.08Spark實戰尋找5億次訪問中,訪問次數最多的人2019.12.08AdvertisementAdvertisement
延伸文章資訊
- 1IICP-顱內壓升高 - 翱翔憂鬱的部落格
所以請謹記Cushing response。 如何測量ICP呢?有以下方法. 1. 腰椎穿刺(lumbar puncture) ...
- 2ICP演算法實現 - 程式前沿
ICP(Iterative Closest Point),即最近點迭代演算法,是最為經典的資料配 ... ICP演算法採用最小二乘估計計算變換矩陣,原理簡單且具有較好的精度, ...
- 3ICP算法及其协方差计算 - 知乎专栏
ICP多用于点云配准的问题中,这在机器人,无人车的定位中常常用到。首先我们来回顾一下正常的ICP算法流程;1、寻找两组点云中的匹配点; 2、定义误差函数, ...
- 4重金屬檢驗方法總則
及鋅標準品(1000 μg/mL)均採用AA 或ICP 分析級。 2.2.3.2. ... 節計算式求出檢體中各重金屬之含量(ppm)。 ... spectrometry, ICP-MS):適用...
- 5筆記>顱內壓升高 - 小護士養成日記
CPP=平均動脈壓(MAP)- 顱內壓(ICP),正常CPP應維持在60~70mmHg,腦部才能得到充足血流量,腦組織可藉由收縮或擴張腦血管使CPP維持恆定,當此調節 ...