体素化

将点云数据数据进行体素化三维重建

算法:
1. 令计算机根据已输入的点云数据,分别计算出XYZ三个方向点云数据坐标的最大值与最小值的差,然后根据三个差值来确定初始体素的长宽高,计算完成后,计算机自动建立出初始体素,所建立的初始体素中已包含所有的点云数据。—–> 建立包含场景的包围盒

2.将初始体素建立好之后,即可对初始体素进行划分(划分的越细,体格越小,分辨率越高)并建立三维模型,具体执行方法为将初始体素分解为N个体积较小的体素(通常像256*256*256这样的方式去划分),用bresenham算法剔除初始体素中的无效体素,剩余的体素即可构成点云数据的三维模型

附上一段matlab代码加深理解,不一定能行

function voxelizer(pcd,res) 

% % pcd: point cloud data 

% % res: resolution in meters 

minxyz = min(pcd); 
maxxyz = max(pcd); 
dxyz = maxxyz - minxyz; 
RANGE = 1; 
% plot initial voxel 
figure; 
voxel(minxyz,dxyz,'b',1); 
axis([minxyz(1)-RANGE 
maxxyz(1)+RANGE 
minxyz(2)-RANGE 
maxxyz(2)+RANGE minxyz(3)-RANGE maxxyz(3)+RANGE]); 
% voxelize 
len = ceil(dxyz/res); 
occu = zeros(len); % occupation grid 
% calculate precision in bresenham_line3D 
precision = 0; 
while (floor(res*10^precision) ~= res*10^precision) 
precision = precision + 1; 
end 
% space carving 
P1 = [0.0 0.0 0.0]; % origin 
for i=1:size(pcd,1) 
P2 = [pcd(i,1) pcd(i,2) pcd(i,3)]; 
[x y z] = bresenham_line3D(P1,P2, precision); 
% precision:meter->0;10 centimeters->1; centimeter->2; milimeter->3; 
for j = 1: length(x) 
if( (minxyz(1)<=x(j) && x(j) <= maxxyz(1)) &&... 
(minxyz(2)<= y(j) && y(j) <= maxxyz(2)) &&... 
(minxyz(3)<= z(j) && z(j) <= maxxyz(3))... 
) 

occu(ceil((x(j)-minxyz(1))/res),ceil((y(j)-minxyz(2))/res),ceil((z(j)-minxyz(3))/res))=1; 

end 

end 

end 
figure; 

for l = 1:len(1) 

for m = 1:len(2) 
for n = 1:len(3) 
if(occu(l,m,n) == 1) 
vox = [minxyz(1)+res*l minxyz(2)+res*m minxyz(3)+res*n]; 
voxel(vox,[res res res],'b',0.5); 
end 
end 
end 
end 
axis([minxyz(1)-RANGE maxxyz(1)+RANGE minxyz(2)-RANGE maxxyz(2)+RANGE minxyz(3)-RANGE maxxyz(3)+RANGE]); 


  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值