使用openCV快速显示图像

时间:2016-04-05 20:44:25

标签: opencv visual-c++ display

我在Windows机器上使用Visual C ++表单和OpenCV编写了一个图像处理应用程序。一切似乎都运行正常,但显示图像非常慢 - 只有几个fps。我希望能够达到30左右。我目前正在使用标准imshow(...),后跟waitkey(1)

我的问题是:是否有更好(即更快)的方式将图像从内存传输到显示器。 openCV使用的Mat结构本质上是一个指向unsigned char值的连续块的花式标题。

修改 我使用VS2013探查器测试了我的代码,它声称我在imshow / waitkey中花费了50%的执行时间。

我在OpenCV Q / A论坛上看到了几个关于此问题的讨论,他们总是以#34;除了调试之外你不应该使用imshow"但没有人建议使用其他任何东西,所以我想我会在这里试试。

1 个答案:

答案 0 :(得分:2)

如果没有看到你所拥有的东西,我将采用这种方法来实现你想要的东西。

  1. 有专门的线程从相机获取帧。将获取的帧插入到同步队列中,该队列由以下队列使用:

  2. 图像处理线程。从队列中取出帧,将它们处理成适合显示的图像。它会更改同步的输出图像,并通知GUI。

  3. Main(GUI)线程仅用于显示。当通知图像更新时,它将同步的输出图像与其当前工作图像交换。 (为了避免复制和额外分配,我们只重用这两个图像缓冲区。)然后它使窗口无效。在WM_PAINT处理程序中,它然后使用BitBlt显示图像。

  4. 一些注意事项:

    • 最小化缓冲区的分配/释放。对于获取,您可以预先分配缓冲池来循环。
    • 以适合显示的格式和尺寸准备输出图像。
    • 跟踪队列中的帧数并设置一些上限。定义一个删除多余帧的算法,这样就不会耗尽内存,也不会过多。
    • 如果您只是想放弃waitKey中的睡眠而想要更简单的事情,请查看this question
    • 检测您的代码 - 使用high resolution timer添加关键部分的时间。记录它们,和/或保存统计数据,历史记录。