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 操作MySQL详解及实例
Apr 30 Python
Python实现发送QQ邮件的封装
Jul 14 Python
Python3 Random模块代码详解
Dec 04 Python
十分钟利用Python制作属于你自己的个性logo
May 07 Python
Python并行分布式框架Celery详解
Oct 15 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
使用pth文件添加Python环境变量方式
May 26 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
Python把图片转化为pdf代码实例
Jul 28 Python
Python爬取某拍短视频
Jun 11 Python
Python PIL按比例裁剪图片
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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
JavaScript静态的动态
2006/09/18 Javascript
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
Python中自定义函数的教程
2015/04/27 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
python 等差数列末项计算方式
2020/05/03 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
python文件及目录操作代码汇总
2020/07/08 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
会议邀请书范文
2014/02/02 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
学生病假条范文
2015/08/17 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
 python中的元类metaclass详情
2022/05/30 Python