估算Julia中点云的法线

时间:2017-07-21 09:17:26

标签: matlab julia

Julia中是否有相应的MATLAB' pcnormals

我还想知道Julia中的readwrite .ply文件是否有办法?

1 个答案:

答案 0 :(得分:1)

pcnormals的描述中,尝试使用距离和kNN包使用Julia重新创建它:

using Distances
using kNN

function pcnormals(pcloud::Matrix,k::Int = 6)
    n,d = size(pcloud)
    S = pairwise(Euclidean(),pcloud')
    NN = hcat([kNN.k_nearest_neighbors(k,i,S) for i=1:n]...)'
    normals = hcat([normalize(pcloud[[i;NN[i,:]],:]\ones(k+1)) for i=1:n]...)'
    return normals
end

N = 1000
D = 3
X = mapslices(normalize,randn(N,D),2)
normals = pcnormals(X)

println("mean inner product = $(mean(X[1:10,:]*normals[1:10,:]'))")
diag(X[1:10,:]*normals[1:10,:]')

定义后的代码是一个迷你测试,它试图查看单位球上的点并查看点的法线是否接近自身(使用内积作为相似性度量)。结果看起来令人信服:

mean inner product = 0.18584539662300542
10-element Array{Float64,1}:
 0.990708
 0.999839
 0.997276
 0.999705
 0.99959 
 0.999883
 0.999052
 0.998935
 0.9951  
 0.999617

因此,除非快速查看pcnormals手册页误导我,否则这可能是Julia实施的起点。请注意在代码中使用pairwise,这对于大点云来说可能很慢。