可以综合使用多种图像代数运算函数来完成一系列的操作,达到视频合成的目的。
提示:
- 有一个视频V1,需要作为背景;
- 从摄像头获取自己的视频,把背景替换为V1;
- 在视频下方加动态字幕;
- 保存视频。
一些简陋的赠删改查,能实现4点功能,但是捕获人像不太精准。
增加字幕见:数字图像处理实验一 实现一个在视频叠加字幕的程序。鼠标点击屏幕,关闭或打开字幕_Lucas*的博客-CSDN博客
主要修改了鼠标绑定的窗口
更改背景见:opencv+python实时替换摄像头捕捉到的视频的背景_梅花鹿先生和他的猫的博客-CSDN博客
博客只能实现改背景为图片,换为视频是室友弄的,思路就是把视频截帧,然后循环播放
# -*- coding: utf-8 -*-
"""
视频背景替换
"""
from PIL import Image
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(5,10)
font = cv2.FONT_HERSHEY_SIMPLEX # 设置字幕字体
flag = True
# 要替换的背景
img1_back=cv2.VideoCapture('vtest.avi')
fourcc = cv2.VideoWriter_fourcc(*'XVID')# 注意编码器
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
def caption(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
global flag
flag = not flag
# 创建一个窗口,并将鼠标处理函数绑定到该窗口
cv2.namedWindow('finalImg')
cv2.setMouseCallback('finalImg', caption)
while True:
ret,frame = cap.read()
ifsu,img_back= img1_back.read()
if ret == False:
continue
#获取图片的尺寸
rows, cols, channels = frame.shape
lower_color = np.array([120, 120, 120])
upper_color = np.array([250, 250, 250])
# 创建掩图
fgmask = cv2.inRange(frame, lower_color, upper_color)
#cv2.imshow('Mask', fgmask)
# 腐蚀膨胀
erode = cv2.erode(fgmask, None, iterations=1)
#cv2.imshow('erode', erode)
dilate = cv2.dilate(erode, None, iterations=1)
#cv2.imshow('dilate', dilate)
rows, cols = dilate.shape
if ifsu:
img_back=img_back[0:rows,0:cols]
print(img_back)
# #根据掩图和原图进行抠图
img2_fg = cv2.bitwise_and(img_back, img_back, mask=dilate)
Mask_inv = cv2.bitwise_not(dilate)
img3_fg = cv2.bitwise_and(frame, frame, mask=Mask_inv)
finalImg=img2_fg+img3_fg
if flag: # 根据flag的状态决定是否要显示字幕
cv2.putText(finalImg, '我的头像', (10, 200), font, 2, (255, 255, 255), 2, cv2.LINE_AA)
# 参数注释: 窗口 输出字符串 坐标 字体 字号 颜色 粗细 线条类型
out.write(finalImg)
cv2.imshow('finalImg', finalImg)
k = cv2.waitKey(10) & 0xFF
if k == 27:
break
cap.release()
cv2.destroyAllWindows()