【发布时间】:2019-04-19 11:15:10
【问题描述】:
我有一些类似这样的简单 OpenCV 代码:
TIMING_START(T1);
cv::cvtColor(fi.getUMat(cv::ACCESS_READ), fi_gray, CV_RGB2GRAY);
TIMING_STOP(T1);
TIMING_START(T2);
cv::threshold(fi_gray, fi_gray, 70, 255, CV_THRESH_BINARY);
TIMING_STOP(T2);
TIMING_START(T3);
cv::Canny(fi_gray, canny_output, 1, 255, 3);
TIMING_STOP(T3);
我尝试完成的事情很好,所以代码的作用不是问题。问题是它需要的时间开销,因为我使用我的集成 GPU 和 OpenCV 3.3 支持 OpenCL 在 iGPU 上运行。这对于第一次之后的每个呼叫都非常有用。我知道初始化和编译 gpu 内核代码需要时间,但我在视频应用程序中使用这些代码,重点是实时性能。因此,第一次通话和图像总是需要 1.5 秒,并且显然会使视频断断续续。之后的调用在
那么有没有办法在 GPU 代码编译并在之后使用 GPU 版本时切换到 CPU 版本?只是这样我就没有第一次“滞后”了。
提前感谢您的建议!
【问题讨论】:
-
有一个解决方案 - 如果可能,在实际运行之前对管道进行空运行。所以一切都准备好了。
-
感谢您的建议。我添加了一个 Initialize() 方法,该方法在开始时执行一个虚拟调用。这对于我的应用程序来说应该足够了。