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的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
Python使用Django实现博客系统完整版
Sep 29 Python
Django用户认证系统 User对象解析
Aug 02 Python
python实现图片压缩代码实例
Aug 12 Python
python线程定时器Timer实现原理解析
Nov 30 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
Python文件操作基础流程解析
Mar 19 Python
Python实现计算图像RGB均值方式
Jun 04 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 Python
图神经网络GNN算法
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
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
WAF的正确bypass
2017/01/05 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
python 文件与目录操作
2008/12/24 Python
OpenCV实现人脸识别
2017/04/07 Python
django实现前后台交互实例
2017/08/07 Python
python移位运算的实现
2019/07/15 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
灵泰克Java笔试题
2016/01/09 面试题
机械制造与自动化应届生求职信
2013/11/16 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
产品设计开发计划书
2014/05/07 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
销售代理协议书
2014/09/30 职场文书
立案决定书范文
2015/06/24 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书