利用matlab處理點雲
本文主要分享利用matlab點雲工具的相關模塊來處理點雲,並通過點雲輪廓對點雲體積進行簡單的估計測量。
目錄
1.主要的操作流程圖
2、具體流程
2.1 點雲的讀入和顯示
假設有一個名為pointcloud.ply的點雲文件。——ply格式簡介
pc = pcread('path\pointcloud.ply'); %讀入點雲文件
pcshow(pc) %顯示點雲
這里需要注意.ply文件中頭文件類似這樣的格式:
element vertex 12
property float x
property float y
property float z
property uchar blue
property uchar green
property uchar red
其中x,y,x是三維點雲的空間坐標,后面的b,g,r代表每個點的顏色,后一項目對於紋理映射和顯示很重要,可以分別提取出來,隨后用pcshow來顯示;
pcread讀入的文件后生成
Location: [850554×3 single]
Color: [850554×3 uint8]
Normal: [850554×3 single]
Count: 850554
XLimits: [6.5701 15.5542]
YLimits: [-1.5363 4.2114]
ZLimits: [-15.7035 0.2691]
我們可以提取出其中的位置和顏色來進行紋理映射並畫圖
figure(1)
pc_tmp(:,1) = pc.Location(:,3); %調整點雲的方位的和xyz軸
pc_tmp(:,2) = pc.Location(:,1);
pc_tmp(:,3) = pc.Location(:,2);
pc_col = pc.Color
pcshow(pc_tmp,pc.Color)
這里利用CMVS/PMVS方法生成的點雲數據作為例子:
2.2 點雲的處理
為了求得這一建築物的體積,通過獲得這一建築物的輪廓包絡來得到其體積。主要利用matlab中的alphaShape函數和volum
alphaShape
此函數主要用於從離散的三維空間點雲中提取邊緣並建立對應的包絡:
shp = alphaShape(x,y,z)
主要控制參數有alpha值,用於控制生產輪廓的精細程度(越小越細膩)
‘RegionThreshold’ 忽略生成包絡中的小物體,壓制小物體的閾值體積
‘HoleThreshold’ 填充包絡中的空洞,生成完整的體積形態
- *alphaShape(x,y,z,alpha,’HoleThreshold ‘,xx,’RegionThreshold’,xx)
需要注意的是需要將點雲的位置坐標轉換為雙精度的類型。
x=pc.Location(:,3);y=pc.Location(:,1);z=pc.Location(:,2);%get point out
x = double(x); y=double(y); z= double(z);
%獲取點雲坐標
alp = 5;region = 0.75;%hole = 1; region = 0.75;
shp = alphaShape(x,y,z,alp);
%生產點雲的包絡數據
%ref:http://cn.mathworks.com/help/matlab/ref/alphashape.html
plot(shp)
%顯示點雲包絡
v= volume(shp);
title(['v= 'num2str(v) ,'m3']) %計算體積並顯示
上圖為生成的點雲包絡(需要仔細條件參數以生成符合需求精度的包絡),通過volum可計算此包絡所占粗略的體積。
