使用openCV快速显示图像
Posted
技术标签:
【中文标题】使用openCV快速显示图像【英文标题】:Fast display of image using 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 除了调试”结束,但没有人建议使用其他任何东西,所以我想我会在这里试试。
伙计
【问题讨论】:
您是如何得出imshow
和waitKey
是瓶颈的结论?您是否分析了您的代码?或者至少有时间吗?您是否在发布版本中对其进行测试?
运行 this little test 在 i7-4930K 和不错的 nVidia 卡上运行 1600x1200 图像给我大约 55 FPS。如果您想自己绘制图像,最快的方法是 OnPaint 处理程序中的 BitBlt。我不使用 Windows 窗体,但我使用了 got a snippet 和 WTL,它非常接近 Windows API。修改它以适合您的目的应该不会太难。
发布模式与调试相比有点帮助(我自己应该想到的),
我可能是它花费大部分时间的处理算法本身。图像尺寸是多少?算法是什么样的?
图像为 5.5MP 16 位,来自 sCMOS 相机。
【参考方案1】:
在没有看到你拥有什么的情况下,我会采取以下方法来实现你想要的。
有一个专用线程用于从相机获取帧。将获取的帧插入到同步队列中,供以下用户使用:
图像处理线程。从队列中取出帧,将它们处理成适合显示的图像。它会更改同步的输出图像,并通知 GUI。
主 (GUI) 线程仅用于显示。当它被通知图像更新时,它会将同步的输出图像与其当前工作图像交换。 (为了避免复制和额外分配,我们只重用这两个图像缓冲区。)然后它使窗口无效。在 WM_PAINT 处理程序中,然后使用 BitBlt
显示图像。
一些注意事项:
尽量减少缓冲区的分配/解除分配。对于采集,您可以有一个预先分配的缓冲区池供循环使用。 以适合显示的格式和大小准备输出图像。 跟踪队列中的帧数并设置一些上限。定义一种算法来丢弃多余的帧,这样您就不会耗尽内存并且不会延迟太多。 如果你只是想摆脱waitKey
的睡眠并想要更简单的东西,请查看this question
检测您的代码 - 使用 high resolution timer 添加关键部分的计时。记录它们,和/或保留统计数据、历史记录。
【讨论】:
以上是关于使用openCV快速显示图像的主要内容,如果未能解决你的问题,请参考以下文章
opencv之python版图像的读取显示保存像素遍历以及结合matplotlib使用