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

问题描述 投票:0回答:1

我目前正在尝试获取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

python c++ vtk
1个回答
0
投票

问题已由我解决,将vtkPointPicker更改为vtkPropPicker将解决问题,但我仍然不知道为什么渲染器变换方法不可行

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.