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 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
详解python的几种标准输出重定向方式
Aug 15 Python
通过Python实现自动填写调查问卷
Sep 06 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
python生成九宫格图片
Nov 19 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
python能做哪些生活有趣的事情
Sep 09 Python
pandas按条件筛选数据的实现
Feb 20 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
PHP 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
Javascript快速排序算法详解
2014/12/03 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
用Python解决计数原理问题的方法
2016/08/04 Python
python多任务之协程的使用详解
2019/08/26 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
英国著名药妆店:Superdrug
2021/02/13 全球购物
学生实习自我鉴定
2013/10/11 职场文书
售后专员岗位职责
2013/12/08 职场文书
政风行风整改方案
2014/10/25 职场文书
2014年就业工作总结
2014/11/26 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS