【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)

一、项目思路

  1. 设置框架参数
  2. 指定存放图像的文件夹地址
  3. 遍历图像并缩放至与框架相同尺寸
  4. 移除摄像头拍摄的背景
  5. 与指定图像进行叠加
  6. 实时更新

二、环境布置

2.1、cvzone安装

  • opencv是一个开源计算机视觉库。
  • cvzone是一个开源计算机视觉库,提供多种类型项目。如:人脸检测、手部跟踪、姿势估计等,以及图像处理和其他 AI 功能。它的核心是使用 OpenCV 和 MediaPipe 库。

(1)在线下载
DOS命令行窗口中输入:pip install cvzone
(2)离线下载(安装包.gz)
PyPi官网下载地址:cvzone:计算机视觉库。
安装过程如下:DOS命令行窗口cd到安装包的setup.py路径,然后输入python setup.py install

更多项目可参考官网:
cvzone官网(github)

2.2、MediaPipe安装

MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架,用于构建多模式(视频,音频和传感器)应用的机器学习管道。可在移动设备、工作站和服务器上跨平台运行,并支持移动 GPU 加速。

(1)在线下载
DOS命令行窗口中输入:

  • pip install opencv-python
  • pip install mediapipe

(2)离线下载(.whl)
PyPi官网下载地址:MediaPipe:为移动、边缘、云和web构建世界级ML解决方案和应用程序的最简单方法。

注意:MediaPipe版本必须与Python的版本对应。

更多项目可参考官网:
MediaPipe官网(github)
MediaPipe官网(gitee-镜像)

2.3、常见问题

关于python的mediapipe库踩过的坑

2.4、注意事项

如何减小锯齿和虚影:
(1)视频中布置的背景尽量简约(如:白墙等),过多的东西容易变成干扰项。
(2)手指间的虚影比较大,尽量减少相关动作。

三、算法详解

3.1、segmentor.removeBG():去除背景(抠图)

在这里插入图片描述

3.2、cvzone.stackImages():堆叠图像

在这里插入图片描述

3.3、fpsReader.update():更新帧图像

在这里插入图片描述

3.4、os.listdir():返回指定的文件夹包含的文件或文件夹的名字的列表。

os.listdir():返回指定的文件夹包含的文件或文件夹的名字的列表。列表以字母排序。不包括 . 和 … ,即使它在文件夹中。只支持在 Unix, Windows 下使用。

函数说明:list = os.listdir(path)
输入参数		path -- 需要列出的目录路径
输入参数:		返回指定路径下的文件和文件夹列表。
################################################
folder_path = r"C:\Users\my\Desktop\Images"                 # 存放图像的文件夹路径(不能有中文)
list_img = os.listdir(folder_path)                          # os.listdir(): 返回指定文件夹下的文件名(列表结构)
print(list_img)                                             # 打印文件夹中的图像名
img_list = []                                               # 存放自定义图像的列表
for img_path in list_img:                           # 遍历文件夹
    image_path = folder_path + '/' + img_path       # 读取图像路径
    img = cv2.imread(image_path)                    # 读取图像
    img_list.append(img)                            # 添加列表元素
print(len(img_list))                                # 打印列表长度

四、实战:基于计算机视觉库(cvzone)的背景替换

在这里插入图片描述

import cv2
import cvzone
import os
from cvzone.SelfiSegmentationModule import SelfiSegmentation

# 摄像头的帧大小是640x480,所以替换的背景图像大小应该与帧大小相同。

# 设置参数
cap = cv2.VideoCapture(0)           # 获取图像设备(0/1)
cap.set(3, 640)                     # 调整输出框架的长
cap.set(4, 480)                     # 调整输出框架的宽
cap.set(cv2.CAP_PROP_FPS, 60)       # 调整输出框架的帧速率
segmentor = SelfiSegmentation()     # 实例化分割模型
fpsReader = cvzone.FPS()            # 显示帧每秒(fps)的输出帧

folder_path = r"C:\Users\my\Desktop\Images"                 # 存放背景图像的文件夹路径(不能有中文)(可存放任意张图像)
list_img = os.listdir(folder_path)                          # os.listdir(): 返回指定文件夹下的文件名(列表结构)
print(list_img)                                             # 打印文件夹中的图像名
img_list = []                                               # 存放自定义图像的列表
for img_path in list_img:                           # 遍历文件夹
    image_path = folder_path + '/' + img_path       # 读取图像路径
    img = cv2.imread(image_path)                    # 读取图像
    print(img.size)                                 # 打印图像尺寸
    img = cv2.resize(img, (640, 480))               # 图像缩放到指定尺寸
    img_list.append(img)                            # 添加列表元素
print(len(img_list))                                # 打印列表长度

img_index = 0                   # 初始化背景图片(列表中索引=0)
while 1:
    reg, img = cap.read()       # 读取帧图像
    img_out = segmentor.removeBG(img, img_list[img_index], threshold=0.5)       # 移除背景
    img_stacked = cvzone.stackImages([img, img_out], 2, 1)                      # 图像叠加
    fps, img_stacked = fpsReader.update(img_stacked, color=(0, 0, 255))         # 实时更新(人物是动态的)
    cv2.imshow("Image_stacked", img_stacked)                                    # 图形化显示(标题名 + 图像)

    key = cv2.waitKey(1)        # 使用 waitKey 可以控制视频的播放速度。数值越小,播放速度越快。
    if key & 0xFF == 27:        # 按Esc退出
        break
    elif key == ord('q'):       # 背景切换
        if img_index > 0:
            img_index -= 1       # Q键:在自定义的图片中,正向选择图片
    elif key == ord('w'):
        if img_index < len(img_list)-1:
            img_index += 1       # W键:在自定义的图片中,逆向选择图片

Opencv项目实战:你这背景太假啦!

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个使用Python+OpenCV+MediaPipe实现手势识别系统的项目示例: 1. 安装必要的库,包括OpenCVMediaPipe和NumPy等。 ``` pip install opencv-python mediapipe numpy ``` 2. 导入必要的库和模块: ```python import cv2 import mediapipe as mp import numpy as np ``` 3. 初始化Hand Tracking模块: ```python mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=False, max_num_hands=2, min_detection_confidence=0.7, min_tracking_confidence=0.7) ``` 4. 读取摄像头捕获到的图像: ```python cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: continue ``` 5. 对图像中的手部进行跟踪和检测: ```python # 转换图像颜色空间 image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 处理图像 results = hands.process(image) # 将图像颜色空间转换回来 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) ``` 6. 对检测到的手部进行手势识别,并根据识别结果做出相应的反应: ```python # 检测到手部 if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # 获取手部关键点坐标 landmarks = np.array([[lmk.x, lmk.y, lmk.z] for lmk in hand_landmarks.landmark]).T # 进行手势识别 gesture = gesture_recognition(landmarks) # 根据手势识别结果做出相应的反应 if gesture == 'Fist': # 做出拳头手势的反应 ... elif gesture == 'Open': # 做出张开手掌的反应 ... else: # 其他手势的反应 ... ``` 7. 释放摄像头和Hand Tracking模块,并关闭窗口: ```python cap.release() hands.close() cv2.destroyAllWindows() ``` 需要注意的是,以上代码只是一个简单的示例,实际的手势识别系统还需要进行模型的训练和优化,以及对不同的手势进行分类和识别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值