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()
请先 后发表评论~