2017-08-08 17 views
0

VTKのpythonバインディングを使用して、ポイントの高さに基づいて大きなポイントクラウドに色付けしています。私はvtk.vtkLookupTableを使用して正しく色付けすることができ、すべての点をループし、GetColor関数を使用してz値に基づいて色を取得していますが、多数の点をループするのは非常に遅いです。VTKの高さ値を使用して大きなポイントクラウドに色を付ける

lookUpTable = vtk.vtkLookupTable() 
lookUpTable.SetTableRange(minz,maxz) 
lookUpTable.Build() 

# Create a unsigned char array to color 
uCharArray = vtk.vtkUnsignedCharArray() 
uCharArray.SetNumberOfComponents(3) 
uCharArray.SetName("colors") 

我々が作成した後LookupTableUnsignedCharArray、私はすべてのポイントをループして上記で定義された配列を埋めています: 下記のコードは、私が コードのことをやった方法を紹介します。

# Assign color by extracting each color 
for i in range(outputPolyData.GetNumberOfPoints()): 
    point = outputPolyData.GetPoint(i) 
    # Get the color from lookup table 
    color = [0]*3 
    lookUpTable.GetColor(point[2],color) 
    # Convert each color to 255 
    for j in range(len(color)): 
     color[j] = int(255 * color[j]) 
    uCharArray.InsertTypedTuple(i,color) 


# # Set Scalars 
outputPolyData.GetPointData().SetScalars(uCharArray) 

出力は enter image description here

になります。しかし1000000ポイント、その服用3.180秒を着色します。私は実際に8000000ポイントを持っています。色を割り当てるには、すべての点をループすると時間がかかります。 私はこれを行うには他の方法があると確信しています。もし誰かが私を正しい方向に向けることができれば、私はうれしいでしょう。

答えて

1

MapScalarsの機能をvtkLookupTableで使用して解決しました。この関数は、ルックアップテーブルを生成するためにクラス内部で使用されます。 私はZ配列を関数に渡しました。それは私に色の配列を与えました。

array = lookUpTable.MapScalars(vtkzArray,vtk.VTK_COLOR_MODE_DEFAULT,-1) 
outputPolyData.GetPointData().SetScalars(array) 

ここでvtkzArrayvtkDataArrayである必要があります。 numpy_supportクラスのvtk_to_numpyを使用してnumpy配列をvtkDataArrayに変換しました。

関連する問題