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如何获取系统iops示例代码
Sep 06 Python
windows下python连接oracle数据库
Jun 07 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
使用Python实现画一个中国地图
Nov 23 Python
Python之Class&Object用法详解
Dec 25 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
详解如何用Python实现感知器算法
Jun 18 Python
Python利用FlashText算法实现替换字符串
Mar 31 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 高性能书写
2010/12/11 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
php显示页码分页类的封装
2017/06/08 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
使用Python解析JSON数据的基本方法
2015/10/15 Python
python实现简单socket通信的方法
2016/04/19 Python
Python编码爬坑指南(必看)
2016/06/10 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
汽车销售求职自荐信
2013/10/01 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
初中生自我评价
2014/02/01 职场文书
数学教研活动总结
2014/07/02 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
信访维稳工作汇报
2014/10/27 职场文书
贫困证明书范文
2015/06/16 职场文书
环保建议书范文
2015/09/14 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
Python+Appium新手教程
2021/04/17 Python
python数据处理之Pandas类型转换
2022/04/28 Python