matlab点云处理--pca创建最小包围盒

原包围盒

matlab点云处理--pca创建最小包围盒_第1张图片

 pca创建的最小包围盒

matlab点云处理--pca创建最小包围盒_第2张图片

%  原包围盒

Lx= max(pt.XLimits)-min(pt.XLimits);%点云数据的长方体包围盒的边长
Ly= max(pt.YLimits)-min(pt.YLimits);
Lz= max(pt.ZLimits)-min(pt.ZLimits);
pcshow(pt)
pos = [99.255 -4.1 0.32 Lx Ly Lz 0 0 0];
showShape('cuboid',pos,'Color','green','Opacity',0.5)

% pca创建局部坐标系

P=(1/size(in,1)) *  transpose(in - mean(in)) * (in - mean(in));
[V,D] = eig(P);


a1 = [1 0 0;0 1 0;0 0 1;0 0 0];
a2 = [transpose(transpose(mean(in))+V(:,1));transpose(transpose(mean(in))+V(:,2));transpose(transpose(mean(in))+V(:,3));mean(in)];

% svd变换 转换到原坐标系下
a1_centrioed = sum(a1',2)/size(a1',2);
a2_centrioed = sum(a2',2)/size(a2',2);
C1 = (a2' - repmat(a2_centrioed,1,size(a2',2))) * transpose(a1' - repmat(a1_centrioed,1,size(a1',2)));
[U,S,V] = svd(C1);
Rotation = V * U';
Translation = a2_centrioed - Rotation*a1_centrioed;
a3 = Rotation * in' + repmat(Translation,1,size(in',2));

% 新包围盒

pt2 = pointCloud(a3');
pcshow(pt2)
pos = [min(pt2.XLimits)+(max(pt2.XLimits)-min(pt2.XLimits))/2 min(pt2.YLimits)+(max(pt2.YLimits)-min(pt2.YLimits))/2 min(pt2.ZLimits)+(max(pt2.ZLimits)-min(pt2.ZLimits))/2 ...
       max(pt2.XLimits)-min(pt2.XLimits) max(pt2.YLimits)-min(pt2.YLimits) max(pt2.ZLimits)-min(pt2.ZLimits) 0 0 0];
showShape('cuboid',pos,'Color','green','Opacity',0.5)

 

 

你可能感兴趣的:(matlab点云处理,matlab)