繁体   English   中英

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

[英]How do I get the right coordinates in VTK

我目前正在尝试在 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_()

这是我的 output

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

这是我获得坐标的第一种方式这是我获得坐标的第二种方式

问题已经被我解决了,把vtkPointPicker改成vtkPropPicker就可以解决了,但是我还是不知道为什么渲染器变换的方法不可行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM