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

作者:tankee 时间:2021-06-16 20:46:39 

目录
  • 实现思路

    • 使用BackgroundSubtractorMOG2进行背景分割

    • 使用人像识别填充面部信息

    • 使用形态学填充分割出来的前景

    • 将人像与目标背景进行合成

  • 代码实现

    实现思路

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

    实现步骤如下。

    使用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()

    来源:https://www.cnblogs.com/tanknee/p/14281641.html

    标签:python,opencv,人像分割,人像合成
    0
    投稿

    猜你喜欢

  • 如何使用Script Encoder?

    2010-06-05 12:42:00
  • Alexa排名数据xml接口及其参数说明

    2008-11-07 13:03:00
  • 改进评论提交表单

    2009-03-25 20:37:00
  • .NET 2.0 的压缩功能代码

    2023-07-14 05:25:22
  • Javascript基础学习之十个重要问题

    2023-07-14 09:17:52
  • SQL学习笔记六 union联合结果集使用

    2011-09-30 11:34:27
  • 浅谈Scrapy框架普通反爬虫机制的应对策略

    2023-07-14 17:11:40
  • 利用sys.sysprocesses检查SqlServer的阻塞和死锁

    2011-11-03 17:24:11
  • asp一个空间绑定N个域名的方法!

    2009-03-08 18:32:00
  • JavaScript登录验证码的实现

    2023-08-23 21:03:12
  • 用 onerror 获取错误信息 js Debug

    2008-11-03 19:08:00
  • numpy创建神经网络框架

    2023-07-10 22:17:50
  • Python使用re模块正则提取字符串中括号内的内容示例

    2022-06-15 14:20:04
  • python变量赋值方法(可变与不可变)

    2021-02-14 08:51:55
  • 聊天室php&mysql(五)

    2023-11-19 20:18:22
  • Python数字图像处理之霍夫线变换实现详解

    2022-01-26 05:59:13
  • 我的css样式写法总结

    2009-01-18 13:04:00
  • 如何让shell终端和goland控制台输出彩色的文字

    2023-07-13 03:24:56
  • PyQt5每天必学之切换按钮

    2023-06-14 09:07:06
  • PHP的PDO预处理语句与存储过程

    2023-06-17 11:49:59
  • asp之家 网络编程 m.aspxhome.com