【问题标题】:Fast display of image using openCV使用openCV快速显示图像
【发布时间】:2016-04-05 20:44:24
【问题描述】:

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

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

编辑: 我使用 VS2013 分析器测试了我的代码,它声称我在 imshow/waitkey 中花费了 50% 的执行时间。

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

伙计

【问题讨论】:

  • 您是如何得出imshowwaitKey 是瓶颈的结论?您是否分析了您的代码?或者至少有时间吗?您是否在发布版本中对其进行测试?
  • 运行 this little test 在 i7-4930K 和不错的 nVidia 卡上运行 1600x1200 图像给我大约 55 FPS。如果您想自己绘制图像,最快的方法是 OnPaint 处理程序中的 BitBlt。我不使用 Windows 窗体,但我使用了 got a snippet 和 WTL,它非常接近 Windows API。修改它以适合您的目的应该不会太难。
  • 发布模式与调试相比有点帮助(我自己应该想到的),
  • 我可能是它花费大部分时间的处理算法本身。图像尺寸是多少?算法是什么样的?
  • 图像为 5.5MP 16 位,来自 sCMOS 相机。

标签: opencv visual-c++ display


【解决方案1】:

在没有看到你拥有什么的情况下,我会采取以下方法来实现你想要的。

  1. 有一个专用线程用于从相机获取帧。将获取的帧插入到同步队列中,供以下用户使用:

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

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

一些注意事项:

  • 尽量减少缓冲区的分配/解除分配。对于采集,您可以有一个预先分配的缓冲区池供循环使用。
  • 以适合显示的格式和大小准备输出图像。
  • 跟踪队列中的帧数并设置一些上限。定义一种算法来丢弃多余的帧,这样您就不会耗尽内存并且不会延迟太多。
  • 如果你只是想摆脱waitKey 的睡眠并想要更简单的东西,请查看this question
  • 检测您的代码 - 使用 high resolution timer 添加关键部分的计时。记录它们,和/或保留统计数据、历史记录。

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多