Slicer study notes (fifty-six) slicer segmentation transformNode contains information and use
1. Print transformNode information
def test_transform(self):
transformMatrix = vtk.vtkMatrix4x4()
print("transformMatrix \n", transformMatrix)
transformMatrix.SetElement(0, 0, -1)
transform_name = "translate_1"
transformNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLTransformNode", transform_name)
transformNode.SetAndObserveMatrixTransformToParent(transformMatrix)
print("transformNode: \n", transformNode)
StemNode = slicer.util.getFirstNodeByClassByName("vtkMRMLModelNode", "Stem")
StemNode.SetAndObserveTransformNodeID(transformNode.GetID())
transformMatrix
vtkMatrix4x4 (0000018CEAF6CB90)
Debug: Off
Modified Time: 295668
Reference Count: 1
Registered Events: (none)
Elements:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
transformNode:
vtkMRMLTransformNode (0000018CE6DC0F50)
ID: vtkMRMLTransformNode1
ClassName: vtkMRMLTransformNode
Name: translate_1
Debug: false
MTime: 295689
Description: (none)
SingletonTag: (none)
HideFromEditors: false
Selectable: true
Selected: false
UndoEnabled: false
Node references:
display [displayNodeRef]: (none)
storage [storageNodeRef]: (none)
transform [transformNodeRef]: (none)
Debug: Off
Modified Time: 295674
Reference Count: 1
Registered Events: (none)
Name = (none)
RestoreSelectionState = 0
TransformNodeID: (none)
ReadAsTransformToParent: 0
TransformToParent:
Transform: vtkTransform
Debug: Off
Modified Time: 295859
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (0000018CF115A0E0)
Event: 36
EventName: ModifiedEvent
Command: 0000018CEBC4B430
Priority: 0
Tag: 2
vtkObserver (0000018CF115A380)
Event: 2
EventName: DeleteEvent
Command: 0000018CEBC4B430
Priority: 0
Tag: 1
Inverse: (0000000000000000)
Matrix: (0000018CEAF6DF40)
Debug: Off
Modified Time: 295863
Reference Count: 1
Registered Events: (none)
Elements:
-1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Input: (0000000000000000)
InverseFlag: 0
NumberOfConcatenatedTransforms: 1
0: vtkSimpleTransform at 0000018CE9E7BE30
DoublePoint: ( 0, 0, 0, 0)
Point: ( 0, 0, 0, 0)
参考:Example of moving a volume along a trajectory using a transform
2. Test
2.1. Before transformation
2.2, after transformation
3. Use coordinate transformation
def calculate_transform(self):
ra_ras = self.get_ras_fiducial_ControlPoints("L1R")
la_ras = self.get_ras_fiducial_ControlPoints("L1L")
M_ras = [(ra_ras[0] + la_ras[0]) / 2, (ra_ras[1] + la_ras[1]) / 2, (ra_ras[2] + la_ras[2]) / 2]
T_trans = vtk.vtkMatrix4x4()
T_trans = self.set_vtkMatrix4x4_Translate(T_trans, -np.array(M_ras))
rcp_ras = self.get_ras_fiducial_ControlPoints("L6R")
lcp_ras = self.get_ras_fiducial_ControlPoints("L6L")
U_ras = [(rcp_ras[0] + lcp_ras[0]) / 2, (rcp_ras[1] + lcp_ras[1]) / 2, (rcp_ras[2] + lcp_ras[2]) / 2]
UM = np.array(M_ras) - np.array(U_ras)
e_3 = UM # Z
LR = np.array(ra_ras) - np.array(la_ras)
e_2 = np.cross(UM, LR) # Y
e_1 = np.cross(e_2, e_3) # X
u = e_1 / np.linalg.norm(e_1)
v = e_2 / np.linalg.norm(e_2)
w = e_3 / np.linalg.norm(e_3)
np_rot = np.array([u, v, w]).T
print("np_rot \n", np_rot)
finalTransform = vtk.vtkTransform()
T_rot = vtk.vtkMatrix4x4()
T_rot = self.set_vtkMatrix4x4_Rotate(T_rot, np_rot)
finalTransform.Translate(np.array(M_ras))
finalTransform.Concatenate(T_rot)
T_ct2hip = finalTransform
transform_name = "T_ct2hip"
transformNode = slicer.util.getFirstNodeByClassByName("vtkMRMLTransformNode", transform_name)
transformNode.SetAndObserveMatrixTransformToParent(T_ct2hip.GetMatrix())
StemNode = slicer.util.getFirstNodeByClassByName("vtkMRMLModelNode", "Stem")
StemNode.SetAndObserveTransformNodeID(transformNode.GetID())
position after coordinate transformation