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 相关文章推荐
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
Linux下使用python自动修改本机网关代码分享
May 21 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python_LDA实现方法详解
Oct 25 Python
python爬虫基本知识
Mar 05 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
python根据url地址下载小文件的实例
Dec 18 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python变量的存储原理详解
Jul 10 Python
Python argparse模块使用方法解析
Feb 20 Python
jupyter notebook实现显示行号
Apr 13 Python
Python中三种花式打印的示例详解
Mar 19 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
PHP开发框架总结收藏
2008/04/24 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
详解vue在项目中使用百度地图
2019/03/26 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
windows系统下Python环境搭建教程
2017/03/28 Python
python的re模块使用方法详解
2019/07/26 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
校园活动策划方案
2014/06/13 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
社保转移委托书范本
2014/10/08 职场文书
督导岗位职责范本
2015/04/10 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS