如何在VTK中获得正确的坐标

2024-05-16 13:54:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试获取VTK中“LeftButtonPressEvent”的鼠标坐标。我以两种方式阅读它。在第一种情况下,我使用Picker进行转换,第二种情况下,我使用DisplayToWorld。 但是结果似乎是两种方式读出的结果不一样,我可以知道第一种读出的结果是对的,但我不知道为什么第二种读出的结果会有偏差,大家都有类似的问题,请告诉我,我找到了很多材料,结果没有得到我想要的,解释两者结果的源代码应该是相同的。下面是代码,我使用的是VTK9.0.0版本 如果要运行代码,可能需要一个DICOM文件

import vtkmodules.all as vtk
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication, QGridLayout, QLabel


from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import sys

class Flat(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.vtk_window = VtkWindow(self)
        # self.vtk_window_2 = VtkWindow(self)
        layout = QGridLayout()
        self.setLayout(layout)
        layout.addWidget(self.vtk_window)
        # layout.addWidget(self.vtk_window_2)

class VtkWindow(QVTKRenderWindowInteractor):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.action = 'scale_image'
        path_dicom = r'C:\Users\AOC\PycharmProjects\VR\vtk_image\ct\1.3.12.2.1107.5.1.4.115586.30000020010800583988700007056.dcm'
        # read
        self.reader = vtk.vtkDICOMImageReader()
        self.reader.SetFileName(path_dicom)
        self.reader.Update()
        # actor
        self.actor = vtk.vtkImageActor()
        self.actor.SetInputData(self.reader.GetOutput())
        # render
        self.ren = vtk.vtkRenderer()
        self.ren.AddActor(self.actor)
        self.GetRenderWindow().AddRenderer(self.ren)

        outline_data = vtk.vtkOutlineFilter()
        outline_data.SetInputConnection(self.reader.GetOutputPort())

        map_outline = vtk.vtkPolyDataMapper()
        map_outline.SetInputConnection(outline_data.GetOutputPort())

        outline = vtk.vtkActor()
        outline.SetMapper(map_outline)
        outline.GetProperty().SetColor(0, 1, 0)

        self.ren.AddActor(outline)

        # picker
        self.picker = vtk.vtkPointPicker()
        self.SetPicker(self.picker)

        # callback listens to MouseMoveEvent invoked by the interactor's style
        style = vtk.vtkInteractorStyleImage()
        self.SetInteractorStyle(style)
        style.AddObserver(vtk.vtkCommand.LeftButtonPressEvent, lambda *args: self.left_button_press_callback(*args))


        ################################
        #############################
        #################################
        self.GetRenderWindow().Render()
        self.Initialize()



    def left_button_press_callback(self, *args):
        position = self.GetEventPosition()
        print("press_position", position)
        self.picker.Pick(position[0], position[1], 0, self.ren)

        world_pos = [self.picker.GetPickPosition()[0], self.picker.GetPickPosition()[1]]
        world_pos1 = self.get_world_point_pos(position)

        print("press_world_pos", world_pos)
        print("press_world_pos1", world_pos1)


    def get_world_point_pos(self, position=[0, 0]):
        """
        :param position: eventPosition()
        :return: world_point_pos
        """
        self.ren.SetDisplayPoint(position[0], position[1], 0)
        self.ren.DisplayToWorld()
        print("self.ren.GetWorldPoint()", self.ren.GetWorldPoint())
        return [self.ren.GetWorldPoint()[0], self.ren.GetWorldPoint()[1]]

class Form(QMainWindow):
    def __init__(self):
        super(Form, self).__init__()

        self.flat = Flat(self)
        self.setCentralWidget(self.flat)
        self.resize(800, 800)
        self.move(800, 100)
        self.show()

    # #
    def closeEvent(self, event):
        self.flat.vtk_window.Finalize()
        # self.flat.vtk_window_2.Finalize()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Form()
    app.exec_()

here's my output

虽然我可以使用Picker来获得正确的坐标,但是Picker的使用会影响我后续的代码,所以我想知道除了Picker之外如何才能获得正确的坐标。我想可能是我缺少了哪一面,但我不知道问题出在哪里。谢谢 我不知道如何直接显示这些图片,对不起,只能使用链接

That's the first way I get the coordinatesThat's the second way I get the coordinates


Tags: theposselfworldinitdefpositionwindow