Numpy uint8_t 数组到 vtkImageData

2024-05-17

我正在尝试拍摄一个或三个通道的 2D 图像并使用 VTK 中显示它们vtkImageActor。据我了解,要显示的当前帧可以通过调用来更新SetImageData on vtkImageActor并提供一个实例vtkImageData.

我已经设置了我的可视化工具,如下所示。但是,我不确定如何构建vtkImageDatanumpy 数组中的对象(这将进入updateFrames方法)。我的 numpy 数组的类型是np.uint8_t.

我正在使用 VTK8.0、Python 3.6 和 Numpy 1.13.1

class VTKStreamVisualiser:
    def __init__(self, displayRGB):
        self.__displayRGB = displayRGB
        self.__started = False

        #Setup window.
        self.__renderWindow = vtk.vtkRenderWindow()
        self.__renderWindowInteractor = vtk.vtkRenderWindowInteractor()
        self.__renderWindowInteractor.SetRenderWindow(self.__renderWindow)

        #To store renderers and actors.
        self.__renderers = []
        self.__actors = []

        #Initialise to None to check if ready when invoking start()
        self.__depthImageData = None
        self.__rgbImageData = None

        #Determine viewport ranges for depth and setup renderer.
        xMinDepth = 0.0
        xMaxDepth = 0.5 if displayRGB else 1.0
        yMin = 0.0
        yMax = 1.0
        self.__setupRenderer(xMinDepth, yMin, xMaxDepth, yMax)

        #Determine viewport ranges for rgb and setup renderer.
        if self.__displayRGB:
            xMinRGB = xMaxDepth
            xMaxRGB = 2.0 * xMinRGB
            self.__setupRenderer(xMinRGB, yMin, xMaxRGB, yMax)

    def __setupRenderer(self, xMin, yMin, xMax, yMax):
        #Setup renderer.
        self.__renderers.append(vtk.vtkRenderer())
        idx = len(self.__renderers) - 1
        self.__renderWindow.AddRenderer(self.__renderers[idx])
        self.__renderers[idx].SetViewport(xMin, yMin, xMax, yMax)
        self.__actors.append(vtk.vtkImageActor())
        self.__renderers[idx].AddActor(self.__actors[idx])
        self.__renderers[idx].ResetCamera()

    def start(self):
        self.__depthImageData is None or (self.__rgbImageData is None and self.__displayRGB):
            return None

        if self.__started:
            return

        self.__renderWindowInteractor.Initialize()
        self.__renderWindow.Render()
        self.__renderWindowInteractor.Start()
        self.__started = True

    def stop(self):
        if not self.__started:
            return

        self.__renderWindowInteractor.Stop()
        self.__renderWindow.Finalize()
        self.__renderWindowInteractor.TerminateApp()
        self.__started = False

    def updateFrames(self, depthFrame, rgbFrame=None):
        #Build vtkImageData here from the given numpy uint8_t arrays.
        pass

编辑:我意识到我可以手动复制数据,如图所示here https://itk.org/Wiki/VTK/Examples/Python/WriteReadVtkImageData,这不会是tooCython 不好(假设我能够使用vtkImageData在 Cython 中),但是最好直接使用 numpy 数组。


一个稍微更完整的答案(概括为 1-3 个通道,不同的数据类型)。

import vtk
import numpy as np
from vtk.util import numpy_support

def numpy_array_as_vtk_image_data(source_numpy_array):
    """
    :param source_numpy_array: source array with 2-3 dimensions. If used, the third dimension represents the channel count.
    Note: Channels are flipped, i.e. source is assumed to be BGR instead of RGB (which works if you're using cv2.imread function to read three-channel images)
    Note: Assumes array value at [0,0] represents the upper-left pixel.
    :type source_numpy_array: np.ndarray
    :return: vtk-compatible image, if conversion is successful. Raises exception otherwise
    :rtype vtk.vtkImageData
    """

    if len(source_numpy_array.shape) > 2:
        channel_count = source_numpy_array.shape[2]
    else:
        channel_count = 1

    output_vtk_image = vtk.vtkImageData()
    output_vtk_image.SetDimensions(source_numpy_array.shape[1], source_numpy_array.shape[0], channel_count)

    vtk_type_by_numpy_type = {
        np.uint8: vtk.VTK_UNSIGNED_CHAR,
        np.uint16: vtk.VTK_UNSIGNED_SHORT,
        np.uint32: vtk.VTK_UNSIGNED_INT,
        np.uint64: vtk.VTK_UNSIGNED_LONG if vtk.VTK_SIZEOF_LONG == 64 else vtk.VTK_UNSIGNED_LONG_LONG,
        np.int8: vtk.VTK_CHAR,
        np.int16: vtk.VTK_SHORT,
        np.int32: vtk.VTK_INT,
        np.int64: vtk.VTK_LONG if vtk.VTK_SIZEOF_LONG == 64 else vtk.VTK_LONG_LONG,
        np.float32: vtk.VTK_FLOAT,
        np.float64: vtk.VTK_DOUBLE
    }
    vtk_datatype = vtk_type_by_numpy_type[source_numpy_array.dtype.type]

    source_numpy_array = np.flipud(source_numpy_array)

    # Note: don't flip (take out next two lines) if input is RGB.
    # Likewise, BGRA->RGBA would require a different reordering here.
    if channel_count > 1:
        source_numpy_array = np.flip(source_numpy_array, 2)

    depth_array = numpy_support.numpy_to_vtk(source_numpy_array.ravel(), deep=True, array_type = vtk_datatype)
    depth_array.SetNumberOfComponents(channel_count)
    output_vtk_image.SetSpacing([1, 1, 1])
    output_vtk_image.SetOrigin([-1, -1, -1])
    output_vtk_image.GetPointData().SetScalars(depth_array)

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

Numpy uint8_t 数组到 vtkImageData 的相关文章

随机推荐

  • cURL 错误 77:设置证书验证位置时出错:CAfile

    我正在使用 Firebase php SDKlink https firebase php readthedocs io en latest index html并在 Windows 10 上的 XAMPP 服务器上使用 laravel 最
  • 在每台计算机安装中删除 HKCU 下的注册表项

    我使用 WiX 3 6 构建了一个 perMachine 安装程序来安装我尚未开发的软件 不幸的是 该软件在执行期间在 HKCU 下创建了一些注册表项 卸载时 还应删除自行创建的密钥 移除这些钥匙似乎并不那么容易 我正在与 ICE57 和
  • 重复使用相同的卷曲手柄。性能大幅提升?

    在 PHP 脚本中 我对不同的 URL 执行了许多不同的curl GET 请求 一百个 将重复使用来自curl init提高性能 还是与请求的响应时间相比可以忽略不计 我这么问是因为在当前的架构中保持相同的句柄并不容易 交叉发布自我应该关闭
  • 在 ASP.NET 中加密 cookie

    我想在 ASP NET 中加密 cookie 我已关注本文的方法 http www codeproject com KB web security HttpSecureCookie aspx 但它有一个缺点 那就是在内部方法上使用反射 这导
  • 加速美丽汤

    我正在运行本课程网站的抓取工具 我想知道将页面放入 beautifulsoup 后是否有更快的方法来抓取页面 花费的时间比我预期的要长得多 Tips from selenium import webdriver from selenium
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • scanf() 和 strtol() / strtod() 在解析数字方面的区别

    Note 我完全重新设计了这个问题 以更正确地反映我设置赏金的目的 请原谅这可能造成的与已给出答案的任何不一致 我不想创建一个新问题 因为之前对此问题的回答可能会有所帮助 我正在致力于实现一个 C 标准库 并且对该标准的一个特定角落感到困惑
  • 如何在 Zend Framework 中存储 cron 作业的脚本?

    因为 ZF 的所有 URL 都依赖于 mod 重写 所以我并不清楚应该在哪里存储用于 cron 作业的本地脚本 有人有什么建议 或者有 正式接受 的方式吗 我用模块化目录结构 http framework zend com manual e
  • 如何在函数执行后停止 tkinter?

    我在停止 提要 时遇到问题 cancel 参数似乎对 after 方法没有任何影响 尽管 feed stop 被打印到控制台 我正在尝试使用一个按钮来启动源 另一个按钮来停止源 from Tkinter import Tk Button i
  • 如何使用 JavaScript 检测 CSS 变量支持?

    最新版本的 Firefox 支持CSS 变量 http www w3 org TR css variables 但 Chrome IE 和许多其他浏览器没有 应该可以访问 DOM 节点或编写一个小方法来返回浏览器是否支持此功能 但我还没有找
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 伪元素和 SELECT 标签

    是否select标签允许使用 after选择器是为了在之后创建一个伪元素吗 我在 Mac 上尝试过 Chrome Safari 和 Firefox 但似乎不起作用 这是我使用过的折衷方案 http jsfiddle net pht9d295
  • Spring JMS监听器即使在异常时也会确认

    我正在使用 JMS 向 SQS 队列发送 接收消息 但是即使在使用 client acknowledge 时出现异常 我也无法重新传递消息 如何实现这一目标 我尝试了一个简单的测试 JmsListener destination test
  • 使用 Hibernate 将 Oracle 日期映射到 Java 对象

    我收到消息 文字与格式字符串不匹配 例如 以下是 Java 类中的一些方法 public String getDateTime public void setDateTime String date time 以下是该类的 Hibernat
  • 在 Windows 7 上安装 Visual Studio 2015 社区版

    我尝试在 Windows 7 64 位上安装 Visual Studio 2015 社区版 由于某种原因 安装程序显示 安装被阻止 并显示错误 此版本的 Visual Studio 需要一台装有较新版本 Windows 的计算机 为了完全安
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • xamarin 形式的图像上方其他图像的一半

    我正在使用 xamarin 表单 我需要创建一个布局 其中两个对象的位置如下 一个 圆 的一半在另一个对象 正方形 之上 我已经搜索过了 看来我需要使用相对布局 我尝试将两个对象设置在同一网格 行和行 0 中 然后使用constraintX
  • 静态属性赋值后为空

    我有这个代码 static class Global public static readonly IChannelsData Channels new ChannelsData public static readonly IMessag
  • 在组合框中显示可见工作表

    您好 我有以下代码来在组合框中显示工作表 创建工作表后 工作表会自动添加到列表中 我不希望隐藏的工作表在保管箱中可见 我怎么做 Option Explicit Private Sub ComboBox1 Change If ComboBox
  • Numpy uint8_t 数组到 vtkImageData

    我正在尝试拍摄一个或三个通道的 2D 图像并使用 VTK 中显示它们vtkImageActor 据我了解 要显示的当前帧可以通过调用来更新SetImageData on vtkImageActor并提供一个实例vtkImageData 我已