You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:06:07