我正在尝试使用 vtk 构建统计形状模型。Procrustes Alignment 和 Principal Component Analysis 函数在 vtk 中已经可用,并且有它们的 python 示例。但是,我很难访问 vtkPCAAnalysisFilter() 的结果。
具体来说,我正在尝试遵循我在 vtk.org 网站上找到的示例。我制作了 3 个文本文件,其中包括形状轮廓上某些点的坐标。然后我将这些点转换为 vtkPolyData ,然后执行 ProcrustesAlignment ,然后是 PCA:
#ProcrustesAlignment
group = vtk.vtkMultiBlockDataGroupFilter()
group.AddInputData(poly_1)
group.AddInputData(poly_2)
group.AddInputData(poly_3)
procrustes = vtk.vtkProcrustesAlignmentFilter()
procrustes.SetInputConnection(group.GetOutputPort())
procrustes.GetLandmarkTransform().SetModeToSimilarity()
procrustes.Update()
#PCA filter
pca = vtk.vtkPCAAnalysisFilter()
pca.SetInputConnection(procrustes.GetOutputPort())
pca.Update()
#displaying the most important eigenvalues
EVNo = pca.GetModesRequiredFor(0.98)
for j in range (0,EVNo):
print pca.GetEvals().GetValue(j)
但是,我无法访问 PCA 产生的特征向量。另外,如何将平均模型节点写入文件。最后,如何获得新“测试”形状所需的系数(我认为我应该使用 pca.GetShapeParameters(shapea, params, 2),但如何将结果写入某处?)。在示例中,我使用了以下部分,以便能够可视化 PCA 结果:
params = vtk.vtkFloatArray()
params.SetNumberOfComponents(1)
params.SetNumberOfTuples(1)
params.SetTuple1(0,0.0)
shapea = vtk.vtkPolyData()
shapea.DeepCopy(poly_1)
pca.GetParameterisedShape(params,shapea)
normalsa = vtk.vtkPolyDataNormals()
normalsa.SetInputData(shapea)
map3a = vtk.vtkPolyDataMapper()
map3a.SetInputConnection(normalsa.GetOutputPort())
Actor3a = vtk.vtkActor()
Actor3a.SetMapper(map3a)
Actor3a.GetProperty().SetDiffuseColor(1.0000,0.3882,0.2784)
Actor3a.GetProperty().SetPointSize(5)
但是,我仍然对定义的“params”和“shapea”感到困惑。
任何帮助将不胜感激。
谢谢,