vtkPythonAlgorithm 控制管道执行

2024-06-04

我正在尝试用 python 编写一个 vtk 过滤器ProjectDepthImage进行投影不是问题。它控制 vtk 管道的执行。

基本上,我对“UserEvent”有一个回调(当用户在渲染窗口处于活动状态时按下“u”键时会触发该回调)。这将调用该函数:render_point_cloud()我发现我需要在此回调中调用 diff.Modified() 和 pdi.Update() ,否则我会得到意外的结果。但是,通过执行此操作,RequestData() 会执行两次,如打印语句所示。

我真的想正确使用 VTK 管道,并且我希望 RequestData() 仅在用户点击“u”时执行一次

由于 vtkWindowToImageFilter 的工作方式,我必须在 diff 上调用 Modified() :http://www.vtk.org/doc/nightly/html/classvtkWindowToImageFilter.html#details http://www.vtk.org/doc/nightly/html/classvtkWindowToImageFilter.html#details

最佳帖子vtkPythonAlgorthim我发现:https://blog.kitware.com/vtkpythonalgorithm-is-great/ https://blog.kitware.com/vtkpythonalgorithm-is-great/

import vtk

from vtk.util import numpy_support
from vtk.numpy_interface import dataset_adapter as dsa
from vtk.numpy_interface import algorithms as alg

import numpy as np

import matplotlib.pyplot as plt

from timeit import default_timer as timer
import time


# import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase


class ProjectDepthImage(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
                                        nInputPorts=1, inputType='vtkImageData',
                                        nOutputPorts=1, outputType='vtkPolyData')
        self.__ren = []
        self.__renWin = []

        self.__display_pts = []
        self.__viewport_pts = []
        self.__world_pts = []
        self.__sizex = []
        self.__sizey = []

    def SetRenderer(self, renderer):
        if renderer != self.__ren:
            self.__ren = renderer
            self.Modified()

    def GetRenderer(self):
        return self.__ren

    def SetRenderWindow(self, render_window):
        if render_window != self.__renWin:
            self.__renWin = render_window
            self.Modified()

    def GetRenderWindow(self):
        return self.__renWin

    def RequestData(self, request, inInfo, outInfo):
        print 'Executing'

        # all the depth values
        inp = dsa.WrapDataObject(vtk.vtkImageData.GetData(inInfo[0]))
        depth = numpy_support.vtk_to_numpy(inp.PointData['ImageScalars'])

        # update the viewport points, check to see if render window size has changed
        self.__update_viewport_points(depth)

        # transformation matrix, viewport coordinates -> world coordinates
        tmat = ren.GetActiveCamera().GetCompositeProjectionTransformMatrix(
            ren.GetTiledAspectRatio(),
            0.0, 1.0)
        tmat.Invert()
        tmat = self.__vtkmatrix_to_numpy(tmat)

        # project to world coordinates
        self.__world_pts = np.dot(tmat, self.__viewport_pts)
        self.__world_pts = self.__world_pts / self.__world_pts[3]

        # for storing the point cloud
        points = vtk.vtkPoints()
        vertices = vtk.vtkCellArray()
        polydata = vtk.vtkPolyData()
        out = vtk.vtkPolyData.GetData(outInfo)
        for i in np.arange(self.__world_pts.shape[1]):
            pt_id = points.InsertNextPoint(self.__world_pts[0:3, i])
            vertices.InsertNextCell(1)
            vertices.InsertCellPoint(pt_id)
        polydata.SetPoints(points)
        polydata.SetVerts(vertices)
        out.ShallowCopy(polydata)

        return 1

    def __update_viewport_points(self, depth):
        # if the render windows size has not changed, just return
        if (self.__sizex, self.__sizey) == self.__renWin.GetSize():
            self.__viewport_pts[2, :] = depth
            return

        # save the new size
        (self.__sizex, self.__sizey) = self.__renWin.GetSize()
        # new display points
        self.__display_pts = np.ones((2, self.__sizex*self.__sizey))
        count = 0
        for i in np.arange(self.__sizey):
            for j in np.arange(self.__sizex):
                self.__display_pts[0, count] = j
                self.__display_pts[1, count] = i
                count += 1
        # new viewport points
        viewport = self.__ren.GetViewport()
        self.__viewport_pts = np.ones((4, self.__display_pts.shape[1]))
        self.__viewport_pts[0,:] = 2.0 * (self.__display_pts[0,:] - self.__sizex*viewport[0]) / (self.__sizex*(viewport[2]-viewport[0])) - 1.0
        self.__viewport_pts[1,:] = 2.0 * (self.__display_pts[1,:] - self.__sizey*viewport[1]) / (self.__sizey*(viewport[3]-viewport[1])) - 1.0
        self.__viewport_pts[2,:] = depth
        # new world points (of the right size)
        self.__world_pts = np.ones(self.__viewport_pts.shape)

    def __vtkmatrix_to_numpy(self, matrix):
        """
        Copies the elements of a vtkMatrix4x4 into a numpy array.
        :type matrix: vtk.vtkMatrix4x4
        :param matrix: The matrix to be copied into an array.
        :rtype: numpy.ndarray
        """
        m = np.ones((4, 4))
        for i in range(4):
            for j in range(4):
                m[i, j] = matrix.GetElement(i, j)
        return m


def render_point_cloud(obj, env):
    start = timer()

    dif.Modified()
    pdi.Update()

    end = timer()
    print(end-start)


# ren, renWin, iren - vtk rendering objects
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# create cube
cube = vtk.vtkCubeSource()
cube.SetCenter(0, 0, 0)
cubeMapper = vtk.vtkPolyDataMapper()
cubeMapper.SetInputConnection(cube.GetOutputPort())
cubeActor = vtk.vtkActor()
cubeActor.SetMapper(cubeMapper)
ren.AddActor(cubeActor)

# set camera intrinsic params to mimic kinect
renWin.SetSize(640, 480)
ren.GetActiveCamera().SetViewAngle(60.0)
ren.GetActiveCamera().SetClippingRange(0.1, 10.0)
iren.GetInteractorStyle().SetAutoAdjustCameraClippingRange(0)
ren.GetActiveCamera().SetPosition(0.0, 0.0, 2.0)

# has to be initialized before filter is update
# not sure why
iren.Initialize()

# dif (depth image filter)
# Filter that grabs the vtkRenderWindow and returns
# the depth image (in this case)
dif = vtk.vtkWindowToImageFilter()
dif.SetInputBufferTypeToZBuffer()
dif.SetInput(ren.GetVTKWindow())
dif.Update()

# pdi (project depth image)
# Gets output of dif and projects the coordinates into world coordinate system
pdi = ProjectDepthImage()
pdi.SetRenderer(ren)
pdi.SetRenderWindow(renWin)
pdi.SetInputConnection(dif.GetOutputPort())
pdi.Update()

# for displaying the point cloud
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(pdi.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetPointSize(2)
rgb = [0.0, 0.0, 0.0]
colors = vtk.vtkNamedColors()
colors.GetColorRGB("red", rgb)
actor.GetProperty().SetColor(rgb)
ren.AddActor(actor)

# needed for first image in loop to be current
ren.Render()
dif.Modified()
pdi.Update()

iren.AddObserver('UserEvent', render_point_cloud)

iren.Start()

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vtkPythonAlgorithm 控制管道执行 的相关文章

随机推荐

  • 将响应更改为仅响应一组值

    我对asp很菜鸟 这是我的代码 response write 目前 这从我的数据库返回两列 我只想返回第二列 即数字 1357
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然
  • htaccess 重写以包含 #!

    呼叫所有 htaccess 专家 我需要你的帮助 我正在尝试强制重写以包含 在网址中 所以基本上我需要 http example com biography http example com biography 将被重写为http exam
  • 绑定未正确更新用户控件属性 MVVM

    编辑 删除旧代码 我将它放在 MainWindow xaml 上
  • 获取直方图数据

    有没有办法在 MySQL 中指定 bin 大小 现在 我正在尝试以下 SQL 查询 select total count total from faults GROUP BY total 生成的数据足够好 但行太多 我需要的是一种将数据分组
  • 如何获取与 Node.js 中的 TypeScript 文件行数相关的错误信息?

    我正在使用 TypeScript 进行 Node js 后端开发 每当我在 node js 中遇到错误时 它都会显示与已转译的 JavaScript js 文件相关的行号 而不是与 TypeScript ts 文件相关的行号 如果您使用了
  • CSS 动画在 Internet Explorer 10 和 11 中不起作用

    以下 css 动画在 Chrome Mozilla Opera 浏览器中完美运行 但在 Internet Exporer 10 和 11 中不起作用 出了什么问题 请参见http jsfiddle net bm72w3n3 http jsf
  • 从 Google Chrome 打印时的页码

    我看过这个答案 page bottom left content counter page counter pages 很多次 但它从来没有为我输出任何内容到页面 即使它应该工作 我尝试过 创造性 的方法来在底部获取页码 但我永远无法让它可
  • 在 PostgreSQL 中存储图像

    好吧 我正在开发一个应用程序 该应用程序将使用运行 PostgreSQL 的 Linux 后端向 Windows 机器提供图像 前端用 C NET 编写 尽管前端应该不重要 我的问题是 在 Postgres 中存储图像的最佳方法是什么 每张
  • axios在自调用函数内部只调用一次(Internet Explorer)

    我有一个函数每 2 5 秒调用自己一次来检查后台运行的任务 它调用 axiosget如果响应错误 则返回一个 url 如果响应成功 我将停止该函数 这在 Chrome 和 Mozilla 上完美运行 但由于某种原因 它在 IE 版本 11
  • 警告从 lambda 返回捕获的引用

    我尝试使用 lambda 有条件地将引用绑定到两个变量之一 int foo bar int choice gt int if true some condition return foo else return bar 这会在 clang
  • Xamarin Forms:System.Reflection.TargetInitationException:调用目标已引发异常

    我正在为这个问题苦苦挣扎 我只是创建了一个简单的跨平台页面 这里是 XAML 代码
  • 如果我更改当前工作目录,为什么 __file__ 会变成无效路径?

    执行中test py from tmp import os print os path abspath file os chdir var print os path abspath file output tmp test py var
  • 如何在没有消息时隐藏 Bootstrap 警报框

    我用 Bootstrap 做了一个简单的警报框 如下所示 div class alertBox span class alert alert info bag session username span div When there is
  • Mac 上的 PythonXY?

    如何在 Mac OS X Lion 上安装 Python 我开始了 它应该能够通过 macports 但无论如何我找不到 mac ports 网站上所述的端口 pythonXY 我对 MAC 和 pythonXY 都不太了解 但在 pyth
  • 从 s3 获取 ogg 轨道的长度而不下载整个文件

    如何在不下载整个文件的情况下获取 ogg 文件的播放长度 我知道这是可能的 因为 HTML5 标签和 VLC 都可以在加载 URL 后立即显示整个播放长度 而无需下载整个文件 有标题或我可以阅读的内容吗 也许甚至是比特率 我可以将其除以文件
  • 使用 SpriteKit 显示横幅广告

    我是 SpriteKit 的新手 刚刚发布了我的第一个游戏 现在我想在游戏中添加横幅广告 然而 我完全迷失了 大多数教程告诉您只需调用 self canDisplayBannerAds YES 在viewDidLoad方法中 我正在这样做
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • vtkPythonAlgorithm 控制管道执行

    我正在尝试用 python 编写一个 vtk 过滤器ProjectDepthImage进行投影不是问题 它控制 vtk 管道的执行 基本上 我对 UserEvent 有一个回调 当用户在渲染窗口处于活动状态时按下 u 键时会触发该回调 这将