123.Python——OpenCV实现视频窗口画中画的效果

在前面有讲过,如何使用多线程来同时开启多个视频窗口,详细可以参看:121.Python——使用多线程同时开启多个摄像头

有时我们可能需要将多个视频画面叠加在一起,实现画中画的效果。本文主要演示如何实现画中画的效果,并通过点击鼠标来实时移动画中画的显示位置。

先看一下实现的效果视频,主画面是一个摄像头视频,子画面是播放的视频文件。

实现的方法说明:

1、先通过OpenCV打开主画面的摄像头视频,并显示视频的主窗口

2、同时打开子画面的视频文件(也可以任意视频流)

3、按要求缩放子画面的大小,并在主画面指定的位置上显示子画面(通过图像ROI的操作)。

==================================================

因为要根据鼠标点击窗体位置来移动子画面,所以需要在主窗体上绑定鼠标事件。这里注意先定义好主窗体名称,在循环体外就把鼠标事件绑定在指定的主窗体上。

实现的完整代码

import cv2
import time

#窗体响应鼠标事件,鼠标左键按下,返回坐标
ix,iy=250,250 #初始位置
def on_mouse(event, x, y, flags, param):
    global ix,iy
    if event == cv2.EVENT_LBUTTONDOWN:
        ix,iy=x,y
        #print("x:",ix,"y:",iy)
        return ix,iy

cap = cv2.VideoCapture(0) 
#获取摄像头的分辨率
#fps = cap.get(cv2.CAP_PROP_FPS)
subcap=cv2.VideoCapture("img/subcam.mp4") #视频文件
#定义窗体
cv2.namedWindow("MainCam")
#把鼠标事件绑定到窗体上
cv2.setMouseCallback("MainCam",on_mouse)
while cap.isOpened():
    ret, frame = cap.read()
    subret,subframe=subcap.read()
    subframe=cv2.resize(subframe,(subframe.shape[1]//6,subframe.shape[0]//6))
    subh,subw=subframe.shape[:2]
    #画中画,将subframe画在frame上,(x,y)是左上角的坐标
    #print(ix,iy)
    if ix>frame.shape[1]-subw or iy>frame.shape[0]-subh:
        ix,iy=250,250
    frame[iy:iy+subframe.shape[0],ix:ix+subframe.shape[1]]=subframe
    strtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
    cv2.putText(frame, strtime, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
    cv2.imshow("MainCam", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    if cv2.getWindowProperty('MainCam',cv2.WND_PROP_AUTOSIZE) < 1:
        break
cap.release()
cv2.destroyAllWindows()
举报
评论 0

    今日头条推荐引擎有 9 条更新

    涉嫌严重违纪违法,陈福生被查!
    大暴雨,12级大风!“新”台风或登陆浙江!明晚尽量别出门
    2025年“全国百强县”榜单出炉,巩义排名上升并位列河南第一!
    上海紧急提醒:不要投喂!近100个小区都发现了,有市民吓坏,成群结队出现,看得心里毛毛的
    14名"女朋友"被抓!有人陪玩、有人谈爱……警方紧急提醒
    党员干部下班后打牌、打麻将,算违法违纪吗?
    悬赏公告!刘明月,女,2003年出生!
    1对2,大对小!菲律宾换了“新打法”,在黄岩岛对中国舰艇连下3次狠手?美国黑手藏不住了