实时Cuda图像处理建议

时间:2012-04-25 11:23:25

标签: image-processing opencv matrix cuda gpu

我正在尝试为相机获得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]吗?例如,对于200x200尺寸的1000张图像,我最终会得到40000个矩阵 包含一个像素的1000个值? CUDA会给我一些像OpenCV这样的选项来制作矩阵吗?还是矢量?

3 个答案:

答案 0 :(得分:4)

  

1 - 我是否需要在CUDA中添加任何图像处理库添加?

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

  

2 - CUDA是否为我提供了一些像OpenCV这样的选项来制作矩阵?

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

答案 1 :(得分:2)

听起来你将有40000个独立的计算,其中每个计算只能在一个(时间)像素内工作。如果是这样,这应该是GPU的一项好任务。你的352核心费米GPU应该能够击败你的12个超线程至强核心。

您计划的算法是否运行常规操作?听起来可能不是,在这种情况下,您可能需要编写自己的内核。

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

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

答案 2 :(得分:1)

  

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

披露:我的公司发展和市场CUVILib

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

  1. 将图像数据和图像保存为2D矩阵的CuviImage对象
  2. 您可以编写自己的GPU功能,并将CuviImage用作2D GPU矩阵。
  3. CUVILib已经提供了丰富的成像功能,如色彩操作,图像统计,特征检测,运动估计,FFT,图像变换等,因此您可能会找到所需的功能。
  4. 关于GPU是否适合您的应用的问题:是的!成像是并行计算的理想领域之一。

    链接: