如何使用OpenCV将两路摄像头视频流显示在同一个窗口中
OpenCV双摄像头同窗口拼接显示实现方案
你已经实现了多线程读取两路摄像头流,仅需在显示环节新增帧拼接步骤即可,不需要调整现有读流逻辑,具体实现步骤如下:
- 保留现有多线程读帧逻辑:每个摄像头对应独立读线程,线程内不断更新各自的最新帧缓存,读取和访问帧缓存操作加线程锁,避免读写冲突导致花屏
- 帧拼接:因为两路视频分辨率完全一致,直接调用OpenCV内置拼接函数即可:
- 水平左右拼接用
cv2.hconcat([frame1, frame2]) - 垂直上下拼接用
cv2.vconcat([frame1, frame2])
如果需要自定义显示效果,比如中间加分割线、给每路视频加文字标注,可以在拼接前后对帧做绘制操作
- 水平左右拼接用
- 统一显示:在显示线程/主线程中,每次拿到两路最新的有效帧后执行拼接,再调用
cv2.imshow()展示拼接后的帧即可,显示环节统一加cv2.waitKey(1)处理窗口事件,退出程序时记得调用cv2.destroyAllWindows()释放所有窗口资源
核心逻辑代码示例
import cv2 import numpy as np # 此处省略你已实现的多线程读帧、帧缓存获取逻辑 # frame1 = 摄像头1的最新帧 # frame2 = 摄像头2的最新帧 if frame1 is not None and frame2 is not None: # 水平拼接 combined_frame = cv2.hconcat([frame1, frame2]) # 若需要垂直拼接可替换为:combined_frame = cv2.vconcat([frame1, frame2]) # 可选效果:在两路视频拼接处加2px宽的白色分割线 line_pos = frame1.shape[1] cv2.line(combined_frame, (line_pos, 0), (line_pos, combined_frame.shape[0]), (255,255,255), 2) # 显示拼接后的总帧 cv2.imshow("Dual Camera Output", combined_frame) # 退出逻辑 if cv2.waitKey(1) & 0xFF == ord('q'): # 此处省略你已实现的摄像头资源释放逻辑 cv2.destroyAllWindows()
如果后续需要自定义布局,比如调整两路视频的显示比例、做2x2多流布局,可以先创建对应分辨率的空白numpy画布,再把两路帧分别拷贝到画布的对应坐标区域即可,灵活性更高。
内容的提问来源于stack exchange,提问作者Raquel
相关产品推荐
相关产品推荐

