ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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

这里把实现方法的具体说明拿出来给大家看看。

1、先把主画面那边的摄像头视频给打开。然后再把显示这个视频的主窗口拿出来呈现给你看。

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()

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进