HQY

×

numpy+opencv绿幕视频换背景

hqy hqy 发表于2026-07-31 10:53:53 浏览215 评论0

抢沙发发表评论

换背景有多方法,剪辑软件,深度学习模型等等。

这种方法可能是最简单快速的了,缺点是需要自己用取色器对视频的绿幕进行取色,然后多次尝试确定一个还可以的上下限,但是最终还是会有边缘效果一般的情况。

优点是速度快,比起基于深度学习的模型来说。

import cv2import numpy as np# 读取视频文件cap = cv2.VideoCapture('a.mp4')# 读取替换图像并调整尺寸background = cv2.imread('bg.jpg')if background.shape[:2] != (int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)), int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))):    background = cv2.resize(background, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))# 目标颜色的BGR范围(基于#25B77F,稍微扩展上下限)lower_bound = (90, 140, 10)  # BGR 下限upper_bound = (180, 210, 110)  # BGR 上限# 定义缩放比例scale_percent = 50  # 缩放到50%while cap.isOpened():    ret, frame = cap.read()    if not ret:        break

    # 提取绿幕部分
    green_mask = cv2.inRange(frame, lower_bound, upper_bound)    # 生成反向掩码
    inverse_mask = cv2.bitwise_not(green_mask)    # 使用掩码提取背景和原视频的不同部分
    foreground = cv2.bitwise_and(frame, frame, mask=inverse_mask)    background_part = cv2.bitwise_and(background, background, mask=green_mask)    # 合并两个部分
    combined = cv2.add(foreground, background_part)    # 缩放合并后的图像
    width = int(combined.shape[1] * scale_percent / 100)    height = int(combined.shape[0] * scale_percent / 100)    resized_combined = cv2.resize(combined, (width, height))    # 展示最终替换效果
    cv2.imshow('Replaced Video', resized_combined)    # 按下空格暂停,按下'q'退出
    key = cv2.waitKey(1) & 0xFF    if key == ord(' '):  # 空格暂停        cv2.waitKey(0)    elif key == ord('q'):        breakcap.release()cv2.destroyAllWindows()

image.png

image.png


需要用深度学习模型可以使用xy3xy3/video-background-removal: fork from https://huggingface.co/spaces/innova-ai/video-background-removal/tree/main

fork的hugging face项目,做了一些下载路径的修改


打赏

本文链接:https://www.kinber.cn/post/6738.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客