一、code
1.1 unique function
Reference:https://zhuanlan.zhihu.com/p/47389313
unique按排序顺序返回。[C,ia,ic] = unique(___)
还可返回索引向量 ia
和 ic
。 如果 A
是向量,则 C = A(ia)
且 A = C(ic)
。 如果 A 是矩阵或数组,则 C = A(ia)
且 A(:) = C(ic)
。 如果指定了 'rows'
选项,则 C = A(ia,:)
且 A = C(ic,:)
。
1.2 txt转化为mat
data=load('smallchair.txt');
save smallchair.mat data;
1.3 view
从用户自己定义的视角观察三维图用命令view,这一命令的使用格式为 view(az,el)
az是azimuth(方位角)的缩写,EL是elevation(仰角)的缩写。它们均以度为单位。系统缺省的视点定义为方位角-37.5°,仰角30°。
1.4 uigetfile
[filename,pathname]=uigetfile({'*.mat;*.txt' },'选择点云');
uigetfile可以获取文件夹中的文件,可以获取指定格式,也可以多种格式,或者所有格式。获取多种格式时,所有格式写到同一对单引号下,用分号隔开。
二、compression principle
点云个数N ——> max函数计算xyz最大最小值max/min ——> 确定bounding box边长Lx/Ly/Lz ——> 体积V ——> 单位立方体中点的个数n ——> 子立方体的边长Ls ——> 确定栅格数量mm*nn*ll ——> 确定每个点所在的格子(hh,jj,kk) ——> 求每个格子的中心坐标 ——> 计算每个点与对应的子盒中心点的距离——>将所有格子排序——>一个格子中保留一个点
把程序看了一遍,根据我的理解,应该就是把一个大的包围盒分成很多小的立方体格子,最后每个格子中只保留可能不到一个点,从而实现压缩。
三、result
在csdn下载的代码,运行结果:
code:https://download.csdn.net/download/u013031908/8104863?locationNum=9&fps=1
k=1 时:
四、GUI
跑完以后做作的我,突然想做个Gui界面。不过在gui里显示的不能旋转。
可以查看原点云及压缩后点云,以及压缩前后点的数量。可以手动输入Kc值,控制压缩程度。效果图如下:
点击choose ptcloud后可以选择需要压缩的点云数据: