【问题标题】:Display multiple image streams simultaneously with multithreading and OpenCV imshow()使用多线程和 OpenCV imshow() 同时显示多个图像流
【发布时间】:2019-03-13 18:49:19
【问题描述】:

我有多个线程(每个摄像头一个)需要显示图像。但是,我在使用第二个 NamedWindow 命令时遇到了错误。我阅读了之前的一些 Q/A 并意识到 highgui 和多线程并不能很好地结合在一起,但是,在这种情况下,我需要从线程中运行它。我可以显示其中一个图像流(然后按一个按钮进入下一个)。

我不太倾向于将图像连接在一起并将其传递给主线程(似乎大多数人建议保持高 gui 调用),因为我不想使用比我必须使用的更多的资源。

此外,单独线程中的 imshow 对我来说效果很好(对于单个相机)。我尝试在不同的 shell 中运行单独的程序(这次不是线程,而是进程),它似乎工作 - 有没有办法在 OpenCV 中创建一个单独的进程来同时显示图像流?是否可以在不同的线程中显示多个图像流?

【问题讨论】:

  • 我从来没有设法在多个线程中运行imshow() - 尽管做了很多尝试。我通常不得不对所有imshow()s 和waitKey()s 使用单个线程。将图像处理放在其他线程中很容易,只是看起来不显示。如果有人有一个有效的例子,请也给我发消息!

标签: python multithreading opencv c++11 video-streaming


【解决方案1】:

同时显示多个图像流的一种方法是创建单独的对象,每个对象都有自己的线程轮询来自不同相机的图像。然后,您可以将这些图像拼接到一个面板中以显示所有帧。在抓取每个线程的相机帧后,可以使用单个imshow 面板来显示这些帧。一个带有 4 个相机帧的简单面板:

面板代码:

import cv2
import numpy as np

image = cv2.imread('placeholder5.PNG')

# Note all frames must be of the same size
image = cv2.resize(image, (0, 0), None, .4, .4)

grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
grey_3_channel = cv2.cvtColor(grey, cv2.COLOR_GRAY2BGR)

numpy_horizontal_row1 = np.hstack((image, grey_3_channel))
numpy_horizontal_row2 = np.hstack((grey_3_channel, image))

combined_images = np.concatenate((numpy_horizontal_row1, numpy_horizontal_row2), axis=0)

cv2.imshow('Image panel', combined_images)
cv2.waitKey()

例如,我有一个 imshow 面板来显示 4 个不同的摄像头,每个摄像头都有自己的线程来轮询帧。

【讨论】:

  • 我会尽快对此进行测试,谢谢!
  • 很高兴为您提供帮助。不要忘记接受它是否适合您
  • 还在等待摄像机进来:)
  • @BillQuesy 这是一个相当奇怪的陈述,因为您首先选择打开一个问题
  • 是的,我知道,我最初有相机,但后来它们被带到一个站点进行测试(并保留在那里,因为他们仍在测试它们)。到目前为止,我还没有看到任何迹象表明这个解决方案有效。问题(我在这里推测)似乎与 X11 后端有关。 X11 上的 imshow 线程似乎有很多问题(与我遇到的相同......)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多