1

我正忙于研究点云简化算法。

下面是计算点邻域的法线的代码。我使用了主成分分析。

我想知道我是否正确计算了点的法线和曲率?

我知道法线是无方向的,我的下一步是使用网络 x 创建一个图(从每个点到最近的邻居的边),用 1-|ni*ni+1| 对每条边进行加权 . 然后创建一个最小生成树,然后通过从最高 z 值点开始并在 ni*ni+1=-1 时翻转 ni+1 的方向来启动深度搜索。我将使用 networkx ,这样我就可以实现全球一致的方向。这是最好的方法吗?

谢谢

import numpy as np


#NEIGHBOURING POINTS
XYZ = np.array([[-0.0369122 ,  0.12751199 , 0.00276757],
 [-0.0398624 ,  0.128204  ,  0.00299348],
 [-0.0328896  , 0.12613    , 0.00300653],
 [-0.0396095 ,  0.12667701 ,-0.00334699],
 [-0.0331765,   0.12681  ,   0.00839958],
 [-0.0400911   ,0.128618  ,  0.00909496],
 [-0.0328901  , 0.124518 ,  -0.00282055]])


#GET THE COVARIANCE MATRIX
average=sum(XYZ)/XYZ.shape[0]
b = np.transpose(XYZ - average)
cov=np.cov(b)

#GET EIGEN VALUES AND EIGEN VEECTORS
e_val,e_vect = np.linalg.eigh(cov)

print e_val

print 'eigenvectors'
print e_vect


#DIAGONLIZE EIGENVALUES
print 'eigenvalues'
e_val_d = np.diag(e_val)
print e_val_d 




#FIND MIN EIGEN VALUE
h = np.rank(min(e_val))

#FIND NORMAL
norm =  e_vect[:,h]
print 'normal'
print norm

#CALCULATE CURVATURE
curvature = e_val[0]/(e_val[0]+e_val[1]+e_val[2])
print 'curvature'
print curvature
4

0 回答 0