我在 Windows 机器上使用 Visual C++ 表单和 OpenCV 编写了一个图像处理应用程序。一切似乎都正常,但显示图像的速度非常慢——只有几帧/秒。我希望能够达到 30 左右。我目前使用的是标准 imshow(...)
,然后是 waitkey(1)
。
我的问题是:是否有更好(即更快)的方法将图像从内存获取到显示器。
openCV 使用的 Mat 结构本质上是一个奇特的 header ,指向一个连续的 unsigned char
值 block 。
编辑: 我使用 VS2013 分析器测试了我的代码,它声称我在 imshow/waitkey 中花费了 50% 的执行时间。
我在 OpenCV Q/A 论坛上看到过几个关于这个的讨论,他们总是以“你不应该使用 imshow 除了调试”结束,但没有人建议使用其他任何东西,所以我想我会在这里尝试。
家伙
最佳答案
没有看到你有什么,这里是我会采取的方法来实现你想要的。
有一个专用线程用于从相机获取帧。将获取的帧插入同步队列,由以下对象使用:
图像处理线程。从队列中取出帧,将它们处理成适合显示的图像。它更改同步输出图像,并通知 GUI。
主 (GUI) 线程仅专用于显示。当它收到图像更新通知时,它会将同步输出图像与其当前工作图像交换。 (为了避免复制和额外分配,我们只是重复使用这两个图像缓冲区。)然后它使窗口无效。在 WM_PAINT 处理程序中,它随后使用
BitBlt
显示图像。
一些注意事项:
- 尽量减少缓冲区的分配/解除分配。对于采集,您可以有一个预先分配的缓冲区池来循环。
- 准备适合显示的格式和大小的输出图像。
- 跟踪队列中的帧数并设置一些上限。定义丢弃多余帧的算法,这样您就不会耗尽内存,也不会延迟太多。
- 如果您只想放弃
waitKey
中的 sleep 并想要更简单的东西,请查看 this question - 检测您的代码 - 使用 high resolution timer 添加关键部分的计时。记录它们,和/或保留统计数据、历史记录。
关于opencv - 使用openCV快速显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436688/