python 使用OpenCV进行简单的人像分割与合成


Posted in Python onFebruary 02, 2021

实现思路

通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像。

实现步骤如下。

使用BackgroundSubtractorMOG2进行背景分割

BackgroundSubtractorMOG2是一个以高斯混合模型为基础的背景前景分割算法,

混合高斯模型

python 使用OpenCV进行简单的人像分割与合成

分布概率是K个高斯分布的和,每个高斯分布有属于自己的 μμ 和 σσ 参数,以及对应的权重参数,权重值必须为正数,所有权重的和必须等于1,以确保公式给出数值是合理的概率密度值。换句话说如果我们把该公式对应的输入空间合并起来,结果将等于1。

回到原算法,它的一个特点是它为每一个像素选择一个合适数目的高斯分布。基于高斯模型的期望和标准差来判断混合高斯模型模型中的哪个高斯模型更有可能对应这个像素点,如果不符合就会被判定为前景。

使用人像识别填充面部信息

创建级联分类器

face_cascade = cv2.CascadeClassifier()
face_cascade.load(
  '/usr/local/anaconda3/envs/OpenCV/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml')

使用OpenCV自带的级联分类器,加载OpenCV的基础人像识别数据。

识别源图像中的人像

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

使用形态学填充分割出来的前景

# 形态学开运算去噪点
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
for i in range(15):
  fgmask = cv2.dilate(fgmask, kernel, iterations=1)

通过开操作去掉前景图像数组中的噪点,然后重复进行膨胀,填充前景轮廓。

将人像与目标背景进行合成

def resolve(o_img, mask, faces):
  if len(faces) == 0:
    return
  (x, y, w, h) = faces[0]
  rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
  rgb_mask_front = cv2.bitwise_not(rgb_mask_front)
  cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1)
  o_img = cv2.subtract(o_img, rgb_mask_front)
  return o_img

将分割出来的部分取反再与源图像进行减操作,相当于用一个Mask从原图中抠出一部分。

再与背景进行加操作

out = resolve(frame, fgmask, faces)
out = cv2.add(out, c_frame)

代码实现

import numpy as np
import cv2
import os

# 经典的测试视频
camera = cv2.VideoCapture('./source/background_test2.avi')
cap = cv2.VideoCapture('./source/camera_test2.avi')
face_cascade = cv2.CascadeClassifier()
face_cascade.load(
   os.getcwd()+'/source/haarcascade_frontalface_default.xml')
# 形态学操作需要使用
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 创建混合高斯模型用于背景建模
fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=False)


def resolve(o_img, mask, faces):
  if len(faces) == 0:
    return
  (x, y, w, h) = faces[0]
  rgb_mask_front = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
  rgb_mask_front = cv2.bitwise_not(rgb_mask_front)
  cv2.circle(rgb_mask_front, (int(x + w / 2), int(y + h / 2)), int((w + h) / 4), (0, 0, 0), thickness=-1)
  o_img = cv2.subtract(o_img, rgb_mask_front)
  return o_img


while True:
  ret, frame = cap.read()
  c_ret, c_frame = camera.read()
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

  fgmask = fgbg.apply(frame)
  # 形态学开运算去噪点
  fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
  gray_camera = cv2.cvtColor(c_frame, cv2.COLOR_BGR2GRAY)

  for i in range(15):
    fgmask = cv2.dilate(fgmask, kernel, iterations=1)

  faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  out = resolve(frame, fgmask, faces)
  out = cv2.add(out, c_frame)
  cv2.imshow('Result', out)
  cv2.imshow('Mask', fgmask)
  k = cv2.waitKey(150) & 0xff
  if k == 27:
    break
out.release()
camera.release()
cap.release()
cv2.destroyAllWindows()

以上就是python 使用OpenCV进行简单的人像分割与合成的详细内容,更多关于python opencv人像分割与合成的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python导入oracle数据的方法
Jul 10 Python
解决Python requests 报错方法集锦
Mar 19 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
python实现报表自动化详解
Nov 16 Python
Django入门使用示例
Dec 12 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
tensorflow自定义激活函数实例
Feb 04 Python
Python发送邮件实现基础解析
Aug 14 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 #Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 #Python
手把手教你配置JupyterLab 环境的实现
Feb 02 #Python
python 模块导入问题汇总
Feb 01 #Python
用python制作个视频下载器
Feb 01 #Python
python基于pexpect库自动获取日志信息
Feb 01 #Python
Python入门基础之数字字符串与列表
Feb 01 #Python
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
深入理解python中的闭包和装饰器
2016/06/12 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
党员批评与自我批评
2014/02/12 职场文书
法学求职信
2014/06/22 职场文书
公司员工离职证明书
2014/10/04 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
教师教育教学随笔
2015/08/15 职场文书
学校教代会开幕词
2016/03/04 职场文书
浅析python中特殊文件和特殊函数
2022/02/24 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python