1

我正在尝试为相机获得 1000fps 的系统实现算法,我需要获取所有图像中每个像素的值,并对 N 个图像中像素 [i] [j] 的演变进行不同的计算, 对于图像中的所有像素。我有 (unsigned char *ptr) 我想将它们传输到 GPU 并开始实现算法。但我不确定实时处理的最佳选择是什么。我的系统: CPU Intel Xeon x5660 2.8Ghz(2 个处理器) GPU NVIDIA Quadro 5000

我有以下问题:

  1. 我需要向 CUDA 添加任何图像处理库吗?如果是的话,你有什么建议?

  2. 我可以为像素 [i,j] 创建一个矩阵,其中包含图像大小中每个像素的图像 [1:n] 的值吗?例如,对于 1000 个 200x200 大小的图像,我最终会得到 40000 个矩阵,每个矩阵包含一个像素的 1000 个值?CUDA 是否为我提供了一些选项,例如 OpenCV 以获得矩阵?还是向量?

4

3 回答 3

4

1 - 我需要向 CUDA 添加任何图像处理库吗?

苹果和橙子。每个都有不同的目的。像 OpenCV 这样的图像处理库提供的不仅仅是简单的加速矩阵计算。也许您不需要 OpenCV 在这个项目中进行处理,因为您似乎更愿意直接使用 CUDA。但是您仍然可以使用 OpenCV,以便更轻松地从磁盘加载和写入不同的图像格式。

2 - CUDA 是否为我提供了一些选项,例如 OpenCV 以获得矩阵?

绝对地。前段时间我写了一个简单的(教育)应用程序,它使用 OpenCV 从磁盘加载图像并使用 CUDA 将其转换为灰度版本。该项目名为cuda-grayscale。我还没有使用 CUDA 4.x 对其进行测试,但代码显示了在结合 OpenCV 和 CUDA 时如何进行基本操作。

于 2012-04-25T16:57:23.753 回答
2

听起来您将有 40000 次独立计算,其中每个计算仅在一个(时间)像素内起作用。如果是这样,这对 GPU 来说应该是一个很好的任务。您的 352 核 Fermi GPU 应该能够击败您的 12 个超线程 Xeon 内核。

您计划运行的算法是通用操作吗?听起来可能不是,在这种情况下,您可能必须编写自己的内核。

是的,您可以在 CUDA 中拥有任何类型的元素数组。

将这种“面向流”的方法用于 GPU 实现是有好处的,因为与通过 PCIe 总线的传输相比,它最大化了计算数量。它也可能会带来困难,如果您想以特定顺序处理给定像素的 1000 个值(例如,从最旧到最新),您可能希望避免连续移动内存中的所有帧(以使最新框架的空间)。这会使您对像素值的寻址稍微复杂化,但为了避免移动帧,最好的方法可能是每次添加新帧时用最新帧覆盖最旧的帧。这样,您最终会得到一个有序的“帧堆栈”,但在其中某处的旧帧和新帧之间存在不连续性。

于 2012-04-25T13:28:27.170 回答
1

我需要向 CUDA 添加任何图像处理库吗???如果是的话,你有什么建议?

披露:我公司开发和营销 CUVILib

对于还提供通用功能的 GPU 加速成像库,几乎没有选择。CUVILib 是提供以下选项的选项之一,非常适合您的特定需求:

  1. CuviImage 对象,它将您的图像数据和图像保存为 2D 矩阵
  2. 您可以编写自己的 GPU 函数并将 CuviImage 用作 2D GPU 矩阵。
  3. CUVILib 已经提供了一组丰富的成像功能,如颜色操作、图像统计、特征检测、运动估计、FFT、图像变换等,因此您很有可能会找到所需的功能。

至于 GPU 是否适合您的应用的问题:是的!成像是并行计算的理想领域之一。

链接:

于 2012-04-28T07:49:15.933 回答