多线程读取四个摄像头的图像,按q退出
时间: 2023-07-22 18:12:18 浏览: 129
好的,以下是一个多线程读取四个摄像头图像并按"q"键退出的示例代码:
```python
import cv2
import threading
# 摄像头索引号,根据实际情况调整
camera_indexes = [0, 1, 2, 3]
num_cameras = len(camera_indexes)
# 存储每个摄像头的图像
frames = [None] * num_cameras
# 创建摄像头对象
cameras = [cv2.VideoCapture(index) for index in camera_indexes]
# 检查摄像头是否打开成功
for camera in cameras:
if not camera.isOpened():
print(f"无法打开摄像头 {camera_indexes[cameras.index(camera)]}")
exit()
# 多线程读取图像函数
def read_frames(camera_index):
while True:
ret, frame = cameras[camera_index].read()
frames[camera_index] = frame
# 创建并启动多个线程
threads = []
for i in range(num_cameras):
thread = threading.Thread(target=read_frames, args=(i,))
thread.start()
threads.append(thread)
# 获取摄像头图像并显示,按q键退出
while True:
combined_frame = cv2.hconcat(frames)
cv2.imshow("Camera Feed", combined_frame)
# 检测按键
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
# 等待线程结束
for thread in threads:
thread.join()
# 释放摄像头和关闭窗口
for camera in cameras:
camera.release()
cv2.destroyAllWindows()
```
在这个示例中,我们创建了一个`read_frames`函数,用于在每个线程中读取特定摄像头的图像。然后,我们创建了多个线程,并通过使用不同的摄像头索引来调用`read_frames`函数。每个线程将在后台运行,负责不断读取相应摄像头的图像帧。
在主循环中,我们将读取到的图像拼接在一起,并显示在窗口中。按下"q"键将退出程序。
请注意,多线程编程需要谨慎处理共享数据,确保数据访问的同步和互斥。在这个示例中,我们使用了简单的列表来存储每个摄像头的图像帧,因为Python的GIL(全局解释器锁)会确保对列表的原子操作。
希望对您有所帮助!如有任何疑问,请随时提问。
阅读全文