matlab点云配准(总结性)
前言
點云通常用于測量物理世界表面。 它們應用于機器人導航和感知,深度估計,立體視覺,視覺注冊以及高級駕駛輔助系統(ADAS)。 計算機視覺系統Toolbox?算法提供點云處理功能,用于下采樣,去噪和轉換點云。 該工具箱還提供點云配準,適合三維點云的幾何形狀,以及讀取,寫入,存儲,顯示和比較點云的能力。 您還可以組合多個點云,使用迭代最近點(ICP)算法重建三維場景。
關于名字
在matlab的文檔里說的是Point Cloud Registration , Registration一詞有注冊的意思,也有圖像配準和光柵重合的意思。這里顯然應該翻譯為,配準。
關于matlab點云的配準
您可以使用pcregistericp和pcregisterndt將移動點云注冊到固定點云。 這些配準算法分別基于迭代最近點(ICP)算法和正態分布變換(NDT)算法。 最佳性能需要調整數據屬性。 在使用點云注冊功能之前,請考慮使用pcdownsample對您的點云進行下采樣,從而提高注冊的準確性和效率。
點云的配準
讀入點云后
點云的下采樣
pcdownsample函數完成此操作。
ptCloudOut = pcdownsample(ptCloudIn,'random',percentage)
ptCloudOut = pcdownsample(ptCloudIn,'gridAverage',gridStep)
ptCloudOut = pcdownsample(ptCloudIn,'nonuniformGridSample',maxNumPoints)
三個參數對應的分別是 點云 ,下采樣方法,一個方法的屬性值。關于下采樣方法,以后再談,這個文章不關注這一細節方面。下采樣例子設置三維分辨率為(0.1 x 0.1 x 0.1).
ptCloud = pcread('teapot.ply');
gridStep = 0.1;
ptCloudA = pcdownsample(ptCloud,'gridAverage',gridStep);
figure;
pcshow(ptCloudA);‘
這個是matlab自帶例子可以直接運行。
點云的剛性變換
ptCloudOut = pctransform(ptCloudIn,tform)函數實現改功能;將指定的前向剛性變換應用于輸入點云。
A = [cos(pi/4) sin(pi/4) 0 0; ...
???? -sin(pi/4) cos(pi/4) 0 0; ...
???? 0 0 1 0; ...
???? 0 0 0 1];
tform = affine3d(A);
ptCloudOut = pctransform(ptCloud,tform);
figure
pcshow(ptCloudOut);
xlabel('X');
ylabel('Y');
zlabel('Z');
此處注意,tform 是一個affine3d object。使用了affine3d來完成參數的格式要求。
使用ICP算法配準兩個點云
pcregistericp函數。
關于算法的細節,我們只能另開一篇文章,否則,這個文章會變得又臭又長。ICP估計兩個點云的之間的剛性變換
直接看一個例子,就可以明白,該過程可以得到什么。
A = [cos(pi/6) sin(pi/6) 0 0; ...
??? -sin(pi/6) cos(pi/6) 0 0; ...
??????????? 0???????? 0? 1 0; ...
??????????? 5???????? 5 10 1];
tform1 = affine3d(A);
Transform the point cloud.
ptCloudTformed = pctransform(ptCloud,tform1);
pcshow(ptCloudTformed);
title('Transformed Teapot');
?
tform = pcregistericp(ptCloudTformed,ptCloud,'Extrapolate',true);
disp(tform1.T);
??? 0.8660??? 0.5000???????? 0???????? 0
?? -0.5000??? 0.8660???????? 0???????? 0
???????? 0???????? 0??? 1.0000???????? 0
??? 5.0000??? 5.0000?? 10.0000??? 1.0000
tform2 = invert(tform);
disp(tform2.T);
??? 0.8660??? 0.5000?? -0.0000???????? 0
?? -0.5000??? 0.8660??? 0.0000???????? 0
??? 0.0000?? -0.0000??? 1.0000???????? 0
??? 5.0000??? 5.0000?? 10.0000??? 1.0000
這里可以看到,配準后得到的是一個tform和 剛性變換的tform1 是同一個類型的數據,表示一個剛性變換,affine3d對象。
tfform是配準的成果。結果對比之下可以看到,估計的蠻準的。
這里列出其他用法,以后用空再談
tform = pcregistericp(moving,fixed)
[tform,movingReg] = pcregistericp(moving,fixed)
[___,rmse] = pcregistericp(moving,fixed)
[___] = pcregistericp(moving,fixed,Name,Value)
NDT算法配準兩個點云
tform = pcregisterndt(moving,fixed,gridStep)返回用固定點云注冊移動點云的剛性變換。 點云被體素化為大小為gridStep的立方體。
為了更直觀,還是看例子的效果 (moving fixed表示兩個點云)
?
movingDownsampled = pcdownsample(moving,'gridAverage',0.1);
gridStep = 0.5;
tform = pcregisterndt(movingDownsampled,fixed,gridStep);
movingReg = pctransform(moving,tform);
pcshowpair(movingReg,fixed,'VerticalAxis','Y','VerticalAxisDir','Down')
得到的tform仍然表示一個剛性變換,榮ICP的tform是一樣的。這里的pcshoowpair用于顯示兩組點云的不同之處。
點云的合并
ptCloudOut = pcmerge(ptCloudA,ptCloudB,gridStep)使用框網格過濾器返回合并的點云。 gridStep指定過濾器的3-D框的大小。
直接得到合并后的點云
存儲三維點云的對象
ptCloud = pointCloud(xyzPoints)
ptCloud = pointCloud(xyzPoints,Name,Value)
??? 1
??? 2
xyzPoints是一個 M-by-3 or an M-by-N-by-3 的矩陣。 函數得到的是一個點云對象。
點云對象的存儲以前說過了。
總結
以上是生活随笔為你收集整理的matlab点云配准(总结性)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用matlab处理点云
- 下一篇: PCL经典代码赏析