Imshow多线程

时间:2019-03-13 18:49:19

标签: multithreading opencv c++11

我有多个线程(每个相机一个)需要显示图像。但是,第二个NamedWindow命令遇到了错误。我阅读了先前的一些Q / A,并意识到highgui和多线程并不太好,但是,在这种情况下,我需要从线程中运行它。我可以显示其中一个图像流(然后按一个按钮转到下一个图像流)。

我不太倾向于将图像串联在一起并传递给主线程(似乎大多数人建议保留高GUI调用),因为我不想使用不必要的资源。

此外,在单独的线程中显示视频对我来说效果很好(对于单个摄像机)。我尝试在不同的外壳中运行单独的程序(这次不是线程,而是进程),并且似乎可以正常工作-是否可以在OpenCV中创建一个单独的进程以同时显示图像流?可以在不同的线程中显示多个图像流吗?

1 个答案:

答案 0 :(得分:0)

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

4 panel camera frame

面板代码:

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个不同的摄像机,每个摄像机都有自己的线程来轮询帧。

Camera example with 4 frames