5

真的需要一些帮助和建议,因为我是实时图像处理的新手。

我正在尝试为相机获得 1000fps 的系统实现算法,我需要获取所有图像中每个像素的值,并对 N 个图像中像素 [i] [j] 的演变进行不同的计算, 对于图像中的所有像素。我有 (unsigned char *ptr) 我想将它们传输到 GPU 并开始使用 CUDA 实现算法并将数据返回给 CPU。但我不确定实时处理的最佳选择是什么。我的系统: CPU Intel Xeon x5660 2.8Ghz(2 个处理器) GPU NVIDIA Quadro 5000 问题是我想确保在获得 1000fps 并将它们传递给 GPU 进行处理,我怎样才能确保我不会丢失下一秒来自抓取器的任何数据?我需要在 C++ 中实现多线程吗?和 OpenCV/OpenCL/CUDA 中的并行编程?如果您有任何想法或建议,请告诉我。我真的需要一些实时图像处理专家的建议。谢谢

4

1 回答 1

14

如您所知,OpenCV 使用 CUDA 框架在 GPU 中实现了它的一些功能。

您可以编写自己的 CUDA 代码/函数来对数据进行操作并将其转换为 OpenCV 格式而不会出现任何问题。我演示了如何在cuda-grayscale上做到这一点。我想这个例子回答了你的大部分问题。

请注意,OpenCV 2.3.1 使用 CUDA 4.0,而OpenCV 2.4 仅适用于 CUDA 4.1

关于此声明:

我想确保获得 1000fps 并将它们传递给 GPU 进行处理

您很可能无法像处理来自相机的帧一样快地处理这些帧。如果您不想丢弃任何帧,则可以忘记实时(我假设您使用的不是非常小的图像(10x15))。

如果您确实需要使用 1000 FPS,则必须实现一种缓冲机制来存储来自设备的帧。这就是我们开始讨论多线程系统实现的地方:应用程序的主线程将负责从相机中获取帧并将它们存储在缓冲区中,第二个线程将从缓冲区中读取并执行帧上的处理。

有关如何实现缓冲机制的信息,请查看:

如何实现 cv::Mat 对象(OpenCV)的循环缓冲区?

循环缓冲区的线程安全实现

C + OpenCV:带有循环缓冲区的 IplImage

于 2012-05-10T14:27:31.747 回答