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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
Python中的XML库4Suite Server的介绍
Apr 14 Python
Python卸载模块的方法汇总
Jun 07 Python
Python做文本按行去重的实现方法
Oct 19 Python
python中异常捕获方法详解
Mar 03 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
python使用锁访问共享变量实例解析
Feb 08 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
Python descriptor(描述符)的实现
Nov 15 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
Python基础知识学习之类的继承
May 31 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
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
javascript 一些用法小结
2009/09/11 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Series和DataFrame使用简单入门
2019/11/13 Python
python实现图片上添加图片
2019/11/26 Python
在keras中实现查看其训练loss值
2020/06/16 Python
大学生涯自我鉴定
2014/01/16 职场文书
办公室文员自荐书
2014/02/03 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
党员转正介绍人意见
2015/06/03 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers