1 什么是點云配準(zhǔn)
點云配準(zhǔn)指的是輸入兩幅點云 Ps (source) 和 Pt (target),輸出一個變換矩陣T(即旋轉(zhuǎn)R和平移t)使得 T(Ps)和Pt的重合程度盡可能高。我們可以把點云想象成由無數(shù)個三維點組成的云彩,而點云配準(zhǔn)就是要把這些云彩按照它們實際的位置和姿態(tài)拼接在一起,就像把多個拼圖拼接在一起,最終形成一個完整的三維模型。粗配準(zhǔn)(Coarse Registration)在兩幅點云之間的變換完全未知的情況下進(jìn)行較為粗糙的配準(zhǔn),目的主要是為精配準(zhǔn)提供較好的變換初值。精配準(zhǔn)(Fine Registration)精配準(zhǔn)是給定一個初始變換,進(jìn)一步優(yōu)化得到更精確的變換。粗配準(zhǔn)和精配準(zhǔn)流程如下圖所示:
2 常見的配準(zhǔn)算法
2.1 4PCS配準(zhǔn)
1 原理
并非全共線的共面四點a,b,c,d,定義了兩個獨(dú)立的比率r1和r2,其在仿射變化中是不變且唯一的。現(xiàn)在給定一個具有n個點的點集Q,以及兩個由點P得到的仿射不變的比率r1,r2,對每一對點q1,q2? Q,計算他們的中間點:若任意兩對這樣的點,一對由 r1計算得到的中間點和另一對由 r2計算得到的中間點在允許范圍內(nèi)一致,那么可以認(rèn)為這兩對點可能是 P中基礎(chǔ)點的仿射對應(yīng)點。將四點轉(zhuǎn)化應(yīng)用到全局點云轉(zhuǎn)化,計算點云的匹配重疊度,若達(dá)到設(shè)置的閾值,則完成點云粗配準(zhǔn)。
2 核心代碼
pcl::FPCSInitialAlignmentfpcs;
fpcs.setInputSource(source_cloud);//源點云
fpcs.setInputTarget(target_cloud);//目標(biāo)點云
fpcs.setApproxOverlap(0.7);//設(shè)置源和目標(biāo)之間的近似重疊度。
fpcs.setDelta(0.01);//設(shè)置常數(shù)因子delta,用于對內(nèi)部計算的參數(shù)進(jìn)行加權(quán)。
fpcs.setNumberOfSamples(100);//設(shè)置驗證配準(zhǔn)效果時要使用的采樣點數(shù)量
2.2 K-4PCS配準(zhǔn)
1 步驟
K-4PCS方法主要分為兩個步驟:
(1)利用VoxelGrid濾波器對點云Q進(jìn)行下采樣,然后使用標(biāo)準(zhǔn)方法進(jìn)行3D關(guān)鍵點檢測。
(2)通過4PCS算法使用關(guān)鍵點集合而非原始點云進(jìn)行數(shù)據(jù)的匹配,降低了搜索點集的規(guī)模,提高了運(yùn)算效率。
2 核心代碼
pcl::KFPCSInitialAlignmentkfpcs;
kfpcs.setInputSource(source);//源點云
kfpcs.setInputTarget(target);//目標(biāo)點云
kfpcs.setApproxOverlap(0.7);//源和目標(biāo)之間的近似重疊。
kfpcs.setLambda(0.5);//平移矩陣的加權(quán)系數(shù)。
kfpcs.setDelta(0.002,false);//配準(zhǔn)后源點云和目標(biāo)點云之間的距離
kfpcs.setNumberOfThreads(6);//OpenMP多線程加速的線程數(shù)
kfpcs.setNumberOfSamples(200);//配準(zhǔn)時要使用的隨機(jī)采樣點數(shù)量
pcl::PointCloud::Ptrkpcs(newpcl::PointCloud);
kfpcs.align(*kpcs);
2.3 SAC-IA配準(zhǔn)
1 步驟SAC-IA配準(zhǔn)的實現(xiàn)流程:
①分別計算源點云和目標(biāo)點云的FPFH特征描述子;
②基于FPFH特征描述子對兩個點云中的點進(jìn)行匹配;
③隨機(jī)選擇 n (n >= 3) 對匹配點;
④求解該匹配情況下的旋轉(zhuǎn)與平移矩陣;
⑤計算此時對應(yīng)的誤差;重復(fù)步驟3-5,直到滿足條件,將最小誤差對應(yīng)的旋轉(zhuǎn)和位移作為最終結(jié)果。
2 核心代碼
pcl::SampleConsensusInitialAlignmentsac_ia;
sac_ia.setInputSource(source);
sac_ia.setSourceFeatures(source_fpfh);
sac_ia.setInputTarget(target);
sac_ia.setTargetFeatures(target_fpfh);
sac_ia.setMinSampleDistance(0.1);//設(shè)置樣本之間的最小距離
sac_ia.setCorrespondenceRandomness(6);//在選擇隨機(jī)特征對應(yīng)時,設(shè)置要使用的鄰居的數(shù)量;
pointcloud::Ptralign(newpointcloud);
sac_ia.align(*align);
2.4 主成分分析法(PCA)配準(zhǔn)
1 原理
主要利用點云數(shù)據(jù)的主軸方向進(jìn)行配準(zhǔn)。首先計算兩組點云的協(xié)方差矩陣,根據(jù)協(xié)方差矩陣計算主要的特征分量,即點云數(shù)據(jù)的主軸方向,然后再通過主軸方向求出旋轉(zhuǎn)矩陣,計算兩組點云中心坐標(biāo)的便移直接求出平移向量。
2 核心代碼
voidComputeEigenVectorPCA(constpcl::PointCloud::Ptr&cloud,Eigen::Vector4f&pcaCentroid,Eigen::Matrix3f&eigenVectorsPCA)
{
pcl::compute3DCentroid(*cloud,pcaCentroid);
Eigen::Matrix3fcovariance;
pcl::computeCovarianceMatrixNormalized(*cloud,pcaCentroid,covariance);
Eigen::SelfAdjointEigenSolvereigen_solver(covariance,Eigen::ComputeEigenvectors);
eigenVectorsPCA=eigen_solver.eigenvectors();
}
2.5 ICP配準(zhǔn)
1 原理
ICP算法的核心是最小化一個目標(biāo)函數(shù),實際上就是所有對應(yīng)點之間的歐式距離的平方和。2 步驟
①尋找對應(yīng)點:我們在有初值的情況下,假設(shè)用初始的變換矩陣對source cloud進(jìn)行變換,將變換后的點云與target cloud進(jìn)行比較,只要兩個點云距離小于一定閾值,我們就認(rèn)為這兩個點就是對應(yīng)點。
②R、T優(yōu)化:有了對應(yīng)點之后,我們就可以用對應(yīng)點對旋轉(zhuǎn)R與平移T進(jìn)行估計。這里R和T中只有6個自由度,而我們的對應(yīng)點數(shù)量是龐大的。因此,我們可以采用最小二乘等方法求解最優(yōu)的旋轉(zhuǎn)平移矩陣,一個數(shù)值優(yōu)化問題。
③迭代:我們優(yōu)化得到了一個新的R與T,導(dǎo)致了一些點轉(zhuǎn)換后的位置發(fā)生變化,一些對應(yīng)點也相應(yīng)的發(fā)生了變化。因此,我們又回到了步驟②中的尋找對應(yīng)點方法。②③步驟不停迭代進(jìn)行,直到滿足一些迭代終止條件,如R、T的變化量小于一定值,或者上述目標(biāo)函數(shù)的變化小于一定值,或者對應(yīng)點不再變化等。
3 核心代碼
icp.setInputSource(source);//源點云
icp.setInputTarget(target);//目標(biāo)點云
icp.setTransformationEpsilon(1e-10);//為終止條件設(shè)置最小轉(zhuǎn)換差異
icp.setMaxCorrespondenceDistance(1);//設(shè)置對應(yīng)點對之間的最大距離(此值對配準(zhǔn)結(jié)果影響較大)。
icp.setEuclideanFitnessEpsilon(0.05);//設(shè)置收斂條件是均方誤差和小于閾值,停止迭代;
icp.setMaximumIterations(35);//最大迭代次數(shù)
pcl::PointCloud::Ptricp_cloud(newpcl::PointCloud);
icp.align(*icp_cloud);
3 深度學(xué)習(xí)的配準(zhǔn)算法
①PointNetLK (Deep ICP)是基于 PointNet的改進(jìn)版ICP算法。PointNet被用來提取點云的全局特征,然后使用牛頓法迭代近似相似性變換參數(shù),并且使用這個過程中估計的點對映射來更新權(quán)重。
②Deep Closest Point (DCP)基于深度神經(jīng)網(wǎng)絡(luò)的點云配準(zhǔn)算法,它先通過PointNet提取特征,然后計算每個點在目標(biāo)點云中的最近鄰點,并計算這兩個點之間的距離。之后,它將這些信息傳遞到一個形狀編碼器來學(xué)習(xí)在兩個點云之間尋找最優(yōu)配準(zhǔn)關(guān)系,并輸出變換矩陣使得兩個點云重合。
③PRNetPRNet是基于 PointNet++ 的點云配準(zhǔn)算法。它的主要思想是將兩個點云投射到一個球面上,然后計算在這個球面上的卷積特征。卷積完成后,PRNet使用粗配準(zhǔn)階段進(jìn)行初始配準(zhǔn),再使用 RANSAC 進(jìn)行細(xì)配準(zhǔn),最終輸出配準(zhǔn)矩陣。
④PPFNetPPFNet是基于局部點對特征(PPF)的點云配準(zhǔn)算法,使用神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)點對之間的相對變換,并輸出變換矩陣使得兩個點云對齊。這個算法使用卷積神經(jīng)網(wǎng)絡(luò)對點云進(jìn)行編碼,并學(xué)習(xí) PPF 匹配關(guān)系的特征,并使用訓(xùn)練過的網(wǎng)絡(luò)對新的點云對進(jìn)行配準(zhǔn)。
-
算法
+關(guān)注
關(guān)注
23文章
4684瀏覽量
94394 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5548瀏覽量
122337 -
點云數(shù)據(jù)
+關(guān)注
關(guān)注
0文章
13瀏覽量
1578
原文標(biāo)題:匯總!三維點云配準(zhǔn)算法,包括4PCS、K-4PCS、SAC-IA、ICP、PCA、深度學(xué)習(xí)方法等
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一種快速的三維點云自動配準(zhǔn)方法
三維顱骨自動非剛性配準(zhǔn)方法
基于平移域估計的點云全局配準(zhǔn)算法

基于分層策略的三維非剛性模型配準(zhǔn)算法

使用PCL進(jìn)行點云數(shù)據(jù)粗配準(zhǔn)算法的研究資料分析

評論