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封装对象实现时间效果
Apr 23 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
PyQt5 多窗口连接实例
Jun 19 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
django删除表重建的实现方法
Aug 28 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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实现抓取HTTPS内容
2014/12/01 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
React Router基础使用
2017/01/17 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python实现字典依据value排序
2016/02/24 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
Python自带的IDE在哪里
2020/07/01 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
意向协议书范本
2014/04/23 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
村党建工作汇报材料
2014/11/02 职场文书
党校党性分析材料
2014/12/19 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL