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关键字and和or用法实例
May 28 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
python检查指定文件是否存在的方法
Jul 06 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
python是否适合网页编程详解
Oct 04 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
Python版中国省市经纬度
Feb 11 Python
Python递归函数特点及原理解析
Mar 04 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
Python scrapy爬取起点中文网小说榜单
Jun 13 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
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
JQuery中操作Css样式的方法
2014/02/12 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
vuex实现购物车功能
2020/06/28 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
python读写配置文件操作示例
2019/07/03 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
中国高端家电购物商城:顺电
2018/03/04 全球购物
Linux的文件类型
2012/03/07 面试题
师范生的个人求职信范文
2014/01/04 职场文书
24岁生日感言
2014/01/13 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
教师自我剖析材料
2014/09/29 职场文书
颐和园的导游词
2015/01/30 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
React实现动效弹窗组件
2021/06/21 Javascript
使用javascript解析二维码的三种方式
2021/11/11 Javascript
A22国内电台短波广播频率表
2022/05/10 无线电