在WPF中显示CUDA处理的图像

Bry*_*way 5 wpf cuda image-processing

我有一个WPF应用程序,该应用程序从相机获取图像,处理这些图像并显示它们。处理部分对于CPU来说已经很繁重,因此我研究了将处理转移到GPU并针对它们运行自定义CUDA内核。基本过程如下:

1)从相机获取图像2)将图像加载到GPU 3)调用CUDA内核以处理图像4)显示处理后的图像

WPF到CUDA到显示的控制策略是我要解决的问题。看起来很自然,一旦将图像加载到GPU上,就不必为了显示图像就将其卸载。我读过可以用OpenGL完成,但是我真的需要学习OpenGL并将其包含在我的项目中以便快速显示CUDA处理的图像吗?

我了解(我认为)从C#调用CUDA内核的问题。我的计划是围绕我的CUDA调用构建一个非托管库,我稍后将其包装为C#-或-尝试确定尝试使用哪个托管包装器(managedCUDA,Cudafy等)。我担心使用其中一种预包装器,因为它们似乎都得到了轻微的支持...但是也许我有错误的印象。

无论如何,经过几天研究可能的选择,我感到有些不知所措。任何建议将不胜感激。

Rob*_*lla 2

获取 CUDA 计算结果并将其直接在设备上用于图形活动的过程称为“互操作”。有OpenGL“互操作”和DirectX“互操作”。有大量CUDA 示例代码演示了如何与计算图像交互。

要直接从设备上的计算数据进行显示(无需访问主机),您需要使用这 2 个 API(OpenGL 或 DirectX)之一。

您提到了我听说过的两个托管接口,所以您似乎知道那里的选项。

如果与将图像从主机传输到设备所需的时间相比,处理时间很长(远大于),您可能会考虑首先将图像从主机传输到设备,处理它,然后将其传回,其中然后,您可以使用与显示它相同的管道。然后,您可以决定为互操作付出的额外努力是否值得。

如果您可以分析代码以找出图像处理在主机上花费的时间,然后在设备上进行原型设计以找出速度有多快,这将具有指导意义。

您可能会发现处理时间很长,您甚至可以从双份安排中受益。或者您可能会发现主机上的处理时间非常短(与传输到设备的成本相比),以至于 CUDA 加速没有用处。