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实现命令行闹钟脚本实例
Sep 05 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
Python实现DDos攻击实例详解
Feb 02 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 Python
OpenCV实现常见的四种图像几何变换
Apr 01 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
php采集速度探究总结(原创)
2008/04/18 PHP
php中explode函数用法分析
2014/11/15 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
js css样式操作代码(批量操作)
2009/10/09 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
利用纯js + transition动画实现移动端web轮播图详解
2017/09/10 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python多线程扫描端口代码示例
2018/02/09 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
大学军训感言400字
2014/03/11 职场文书
保密承诺书范文
2014/03/27 职场文书
报关报检委托书
2014/04/08 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
网络研修心得体会
2016/01/08 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis