opencv+python实时替换摄像头捕捉到的视频的背景

如题,使用opencv+python实时替换摄像头捕捉到的视频的背景。

代码如下:

# -*- coding: utf-8 -*-
"""
视频背景替换
"""
from PIL import Image
import numpy as np
import cv2

cap = cv2.VideoCapture(0)
cap.set(5,10)

# 要替换的背景
img_back=cv2.imread('img_back.jpg')


while True:
    ret,frame = cap.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
    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
    cv2.imshow('res', finalImg)

    k = cv2.waitKey(10) & 0xFF
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

使用时需要选择一个较为纯净的背景,使用颜色提取器获取背景中RGB值的范围,即代码中的lower_color和upper_color,进行替换。本代码中的背景是一面白色的墙,因为光照会影响背景的亮度,使用时可以自行调整它的值。

然后需要一张图作为将要替换的背景,替换image_back.jpg即可。

opencv+python实时替换摄像头捕捉到的视频的背景_第1张图片

 

你可能感兴趣的:(python+opencv,视频背景替换)