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 splitlines使用技巧
Sep 06 Python
在Python中用keys()方法返回字典键的教程
May 21 Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 Python
python分布式环境下的限流器的示例
Oct 26 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
python实现逆序输出一个数字的示例讲解
Jun 25 Python
对python中类的继承与方法重写介绍
Jan 20 Python
Django中modelform组件实例用法总结
Feb 10 Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
python 基于opencv实现图像增强
Dec 23 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
php 字符转义 注意事项
2009/05/27 PHP
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
基于pip install django失败时的解决方法
2018/06/12 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
详解Python中的路径问题
2020/09/02 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
化学教师教学反思
2014/01/17 职场文书
团队拓展活动总结
2014/08/27 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
物业管理交接协议书
2016/03/24 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
导游词之山东八大关
2019/12/18 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript