Slicer study notes (fifty-six) slicer segmentation transformNode contains information and use

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

insert image description here

2.2, after transformation

insert image description here

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

insert image description here

Guess you like

Origin blog.csdn.net/juluwangriyue/article/details/123853957