ICP演算法實現 - 程式前沿

文章推薦指數: 80 %
投票人數:10人

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 #include #include #include #include #include #include//pcl控制檯解析根據不同模型設定合適的引數,便可實現最初目的。

例項展示:ICP之變種ICP有很多變種,有point-to-point的,也有point-to-plane的,一般後者的計算速度快一些,是基於法向量的,需要輸入資料有較好的法向量,具體使用時建議根據自己的需要及可用的輸入資料選擇具體方法。

pcl::GeneralizedIterativeClosestPointClassTemplateReferencepcl::IterativeClosestPointClassTemplateReferencepcl::IterativeClosestPointWithNormalsClassTemplateReferencepcl::IterativeClosestPointNonLinearClassTemplateReferencepcl::JointIterativeClosestPointClassTemplateReferencepcl::registration::IncrementalICPClassTemplateReferenceAdvertisementAdvertisement写评论取消回覆很抱歉,必須登入網站才能發佈留言。

近期文章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



請為這篇文章評分?