数字图像处理实验二思考题

可以综合使用多种图像代数运算函数来完成一系列的操作,达到视频合成的目的。

提示:

  1. 有一个视频V1,需要作为背景;
  2. 从摄像头获取自己的视频,把背景替换为V1;
  3. 在视频下方加动态字幕;
  4. 保存视频。

一些简陋的赠删改查,能实现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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值