将点云数据数据进行体素化三维重建
算法:
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]);