PointNet系列点云归一化与反归一化

学习记录:点云归一化操作

def pc_normalize(pc):
    centroid = np.mean(pc, axis=0)
    pc = pc - centroid
    m = np.max(np.sqrt(np.sum(pc ** 2, axis=1)))
    pc = pc / m
    return pc

逐句分析:

 def pc_normalize(pc): #首先定义一个归一化函数,括号内是你要读取的数据名称;

centroid = np.mean(pc, axis=0) #求质心,也就是一个平移量,实际上就是求均值。

#np.mean()的三种用法:

--np.mean(pc):对pc数组的所有数求平均值,不管行-列;

--np.mean(pc,axis=0):对pc数组的每列求平均值。比如我的pc是一个1000×3列的数组,这条函数就是对第一列的1000个数求一个均值,对第二列求一个均值,对第三列求一个均值,通过这条函数最后得到一个1×3的数组[x_mean,y_mean,z_mean];

--np.mean(pc,axis=1):对pc数组的每行求平均值。最后得到一个1000×1的数组。(假设pc为1000×3的矩阵)

pc = pc - centroid #点云平移;

m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) #获取缩放比例;

--pc ** 2:平移后的点云求平方;

--np.sum(pc ** 2, axis=1):#求和

#np.sum()的三种用法

--np.sum(pc): 对pc数组中的所有元素求和;

--np.sum(pc,axis=0):对数据的每列求和。最后得到一个1×3的矩阵。(假设pc为1000×3的矩阵)

--np.sum(pc,axis=1):对数据的每行求和。最后得到一个1000×1的矩阵。(假设pc为1000×3的矩阵)

np.sqrt() #求平方根

np.max() #求最大值

pc=pc/m #对点云进行缩放

return pc #返回缩放平移后的点云



numpy读取、保存点云

 读取txt点云:np.loadtxt()   如:np.loadtxt('a.txt')

保存txt点云:np.savetxt()   如:np.savetxt('b.txt')


问题

由于点云的归一化操作,会使得PointNet预测的结果比原始点云尺寸不同,为了恢复原始大小,可以把预测得到的点云进行反归一化,即使得到的点云乘上缩放尺寸m,再加上平移尺寸centroid。

Pred_restore=pred×m+centroid。

当然,这两个参数需要根据你预测的原始点云获取。

注:水平有限,如有错误,请提出批评建议。

你可能感兴趣的:(python,开发语言,后端)