实现思路

通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像。

实现步骤如下。

使用BackgroundSubtractorMOG2进行背景分割

BackgroundSubtractorMOG2是一个以高斯混合模型为基础的背景前景分割算法,

混合高斯模型

分布概率是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 使用OpenCV进行简单的人像分割与合成相关推荐

  1. python人像精细分割_python 使用OpenCV进行简单的人像分割与合成

    实现思路 通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像. 实现步骤如下. 使用BackgroundSubtractorMOG2进行背 ...

  2. python人像_python 使用OpenCV进行简单的人像分割与合成

    实现思路 通过背景建模的方法,对源图像中的动态人物前景进行分割,再将目标图像作为背景,进行合成操作,获得一个可用的合成影像. 实现步骤如下. 使用BackgroundSubtractorMOG2进行背 ...

  3. python加载图片的方法_python从网络读取图片并直接进行处理的方法

    python从网络读取图片并直接进行处理的方法 更新时间:2015年05月22日 10:09:08 作者:pythoner 这篇文章主要介绍了python从网络读取图片并直接进行处理的方法,涉及cSt ...

  4. python读取gif图片并显示_Python爬虫实现获取动态gif格式搞笑图片的方法示例

    本文实例讲述了python爬虫实现获取动态gif格式搞笑图片的方法.分享给大家供大家参考,具体如下: 有时候看到一些喜欢的动图,如果一个个取保存挺麻烦,有的网站还不支持右键保存,因此使用python来 ...

  5. python爬虫音乐图片的感受_python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  6. python怎么在图片上写字_python如何实现内容写在图片上

    本文实例为大家分享了python将内容写在图片上的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- # Created on 2018/3/20 import bas ...

  7. python加载图片并显示_python读取目录下所有的jpg文件,并显示第一张图片的示例...

    python读取目录下所有的jpg文件,并显示第一张图片的示例 如下所示: # -*- coding: UTF-8 -*- import numpy as np import os from scip ...

  8. python怎么在图片上写字_Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  9. python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

    首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...

最新文章

  1. 蓝桥杯 兰顿蚂蚁(模拟)
  2. java script 月日年转年月日_js的如何进行日期格式转换成年月日
  3. JSP+Servlet + JDBC 实现简单的登录验证模块
  4. api权限管理系统与前后端分离实践
  5. 【POJ - 2728】Desert King (最有比率生成树,分数规划)
  6. sql 同步2个表中的一个字段数据
  7. Carbon Copy Cloner for Mac(磁盘克隆/同步/备份工具)直装版
  8. 区块链 以太坊 入门知识
  9. Android常用组件
  10. 第九届河南省程序设计大赛-NYOJ-1276(搜索batter)
  11. 常用moment时间总结
  12. uefi模式下重装系统
  13. 微信小程序实现一个可以编辑单元格的表格
  14. “兼职发明家召集令”
  15. QQ盗号成腾讯难解之痛
  16. 基于深度学习的几何模型表示 分析与合成
  17. html5网格坐标系,HTML5 四种常用网格(Grid)布局技术
  18. 教程一:微信公众号的申请
  19. 那些年我失败的当让我依然热血沸腾的创业项目之快递到家这里写自定义目录标题
  20. BLE 信道和自适应跳频

热门文章

  1. Q128:PBRT-V3,“体渲染”积分器的“传播方程”(15.1章节)
  2. 怎样卸载连接老师的计算机软件,我的电脑里面solidworks无法卸载,,老师能帮我下吗...
  3. 图片-标签、格式\内联框架\音视频播放——HTML
  4. 大数据分析的方法有哪些
  5. 5种速成数据分析方法
  6. 物联卡的类型有几种,如何区分
  7. 近邻模块︱apple.Turicreate中相似判定Nearest Neighbors(四)
  8. Nginx (Install)
  9. 读论文笔记(1)——web文本挖掘技术研究
  10. @ 添加属性(属性注入)