opencv - 使用openCV快速显示图像

标签 opencv visual-c++ display

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

我的问题是:是否有更好(即更快)的方法将图像从内存获取到显示器。 openCV 使用的 Mat 结构本质上是一个奇特的 header ,指向一个连续的 unsigned char 值 block 。

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

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

家伙

最佳答案

没有看到你有什么,这里是我会采取的方法来实现你想要的。

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

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

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

一些注意事项:

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

关于opencv - 使用openCV快速显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436688/

相关文章:

c++ - 访问 cv::Mat_16UC1 的单个元素

visual-c++ - Visual Studio 2010 中的 C++ 强类型枚举

css - 将鼠标悬停在文本上以使用 CSS 在另一个 div(不是子元素)中显示图像

javascript - 如何使用 if 语句使用 jquery 显示和隐藏 2 div?

css - 显示 inline-*something* 的属性差异

python - 如何在 Python 中使用 OpenCV 概括轮廓手写字符?

php - 无法执行从 php 导入 cv2.so 的 python 脚本

python - 无法在Python中使用OpenCV编写视频

c++ - std::function of a value templated method 使用 clang 和 g++ 编译,但不使用 msvc

c++ - 在什么情况下 sprintf 会优先于 stringstream?