Python实战之基于OpenCV的美颜挂件制作

目录
  • 基于 Snapchat 的增强现实
    • 胡子挂件融合
      • 完整代码
    • 眼镜挂件融合
      • 完整代码

基于 Snapchat 的增强现实

胡子挂件融合

第一个项目中,我们将在检测到的脸上覆盖了一个小胡子。我们可以使用从摄像头捕获的连续视频帧,也可以使用单张测试图像。在进行实际讲解程序的关键步骤前,首先查看应用程序预期输出的结果图像:

项目的第一步是检测图像中的人脸。如上图所示,使用青色矩形绘制图像中检测到的人脸的位置和大小;接下来迭代图像中所有检测到的人脸,在其区域内搜索鼻子,粉红色矩形表示图像中检测到的鼻子;检测到鼻子之后,就要根据之前计算出的鼻子的位置和大小来调整我们想要覆盖“胡子”挂件的区域,蓝色矩形表示计算获得的胡须将被覆盖的区域位置。如果处理的目标是连续视频帧,在处理完成所有检测到的人脸后,将继续分析下一帧。

根据上述描述,程序应当首先检测图像中的人脸和鼻子。为了检测这些对象,创建了两个分类器,一个用于检测人脸,另一个用于检测鼻子:

# 用于人脸和鼻子检测的级联分类器
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml")

一旦创建了分类器,下一步就是使用 cv2.detectMultiScale() 函数检测图像中的这些对象。cv2.detectMultiScale() 函数检测输入灰度图像中不同大小的对象,并将检测到的对象作为矩形列表返回。例如,检测人脸时使用以下代码:

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

接下来,遍历检测到的人脸,尝试检测鼻子:

# 遍历检测到的人脸
for (x, y, w, h) in faces:
    # 根据检测到的面大小创建感兴趣区域(ROI)
    roi_gray = gray[y:y + h, x:x + w]
    roi_color = frame[y:y + h, x:x + w]

    # 在检测到的人脸内检测鼻子
    noses = nose_cascade.detectMultiScale(roi_gray)

检测到鼻子后,遍历所有检测到的鼻子,并计算将被“胡子”挂件覆盖的区域。过滤掉错误的鼻子位置后,将“胡子”挂件根据先前计算的区域覆盖在图像上:

for (nx, ny, nw, nh) in noses:
    # 计算将被“胡子”挂件覆盖的区域坐标
    x1 = int(nx - nw / 2)
    x2 = int(nx + nw / 2 + nw)
    y1 = int(ny + nh / 2 + nh / 8)
    y2 = int(ny + nh + nh / 4 + nh / 6)

    if x1 < 0 or x2 < 0 or x2 > w or y2 > h:
        continue

    # 计算将被“胡子”挂件覆盖的区域尺寸
    img_moustache_res_width = int(x2 - x1)
    img_moustache_res_height = int(y2 - y1)

    # 调整掩膜大小,使其与放置“胡子”挂件的区域相等
    mask = cv2.resize(img_moustache_mask, (img_moustache_res_width, img_moustache_res_height))

    # 翻转掩膜
    mask_inv = cv2.bitwise_not(mask)

    # 将“胡子”挂件调整为所需区域
    img = cv2.resize(img_moustache, (img_moustache_res_width, img_moustache_res_height))
    # 获取原始图像的ROI
    roi = roi_color[y1:y2, x1:x2]
    # 创建ROI背景和ROI前景
    roi_bakground = cv2.bitwise_and(roi, roi, mask=mask_inv)
    roi_foreground = cv2.bitwise_and(img, img, mask=mask)
    # 获取结果
    res = cv2.add(roi_bakground, roi_foreground)
    # 将res置于原始图像中
    roi_color[y1:y2, x1:x2] = res
    break

上述程序的关键在于 img_mustache_mask 图像。此图像是使用要融合的“胡子”图像的 Alpha 通道创建的,使用此图像,将可以只绘制叠加图像的前景,基于融合图像的 alpha 通道创建的“胡子”蒙版如下:

img_moustache = cv2.imread('moustache.png', -1)
img_moustache_mask = img_moustache[:, :, 3]
cv2.imshow("img moustache mask", img_moustache_mask)

获得的胡子蒙版,如下所示:

增强现实融合“胡子”挂件后的结果如下所示:

这里不再针对视频帧的处理进行讲解,因为其方法与单个图像相同,在接下来的完整代码中,给出对连续视频帧进行增强现实的代码。

完整代码

import cv2

# 用于人脸和鼻子检测的级联分类器
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml")

# 加载胡子图像
img_moustache = cv2.imread('moustache.png', -1)
# 创建胡子蒙版
img_moustache_mask = img_moustache[:, :, 3]
# 将胡子图像转换为 BGR 图像
img_moustache = img_moustache[:, :, 0:3]

# 创建 VideoCapture 对象
video_capture = cv2.VideoCapture(0)

while True:
    # 从 VideoCapture 对象捕获帧
    ret, frame = video_capture.read()
    # 将 frame 转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 迭代检测到的人脸
    for (x, y, w, h) in faces:
        # 根据检测到的人脸大小创建ROI
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]
        # 在检测到的人脸中检测鼻子
        noses = nose_cascade.detectMultiScale(roi_gray)

        for (nx, ny, nw, nh) in noses:
            # 计算将放置 “胡子” 挂件的坐标
            x1 = int(nx - nw / 2)
            x2 = int(nx + nw / 2 + nw)
            y1 = int(ny + nh / 2 + nh / 8)
            y2 = int(ny + nh + nh / 4 + nh / 6)

            if x1 < 0 or x2 < 0 or x2 > w or y2 > h:
                continue

            # 计算“胡子”挂件区域的尺寸
            img_moustache_res_width = int(x2 - x1)
            img_moustache_res_height = int(y2 - y1)

            # 根据挂件区域缩放“胡子”蒙版
            mask = cv2.resize(img_moustache_mask, (img_moustache_res_width, img_moustache_res_height))
            # 翻转蒙版
            mask_inv = cv2.bitwise_not(mask)
            # 缩放“胡子”挂件
            img = cv2.resize(img_moustache, (img_moustache_res_width, img_moustache_res_height))

            # 从原始图像中获取ROI
            roi = roi_color[y1:y2, x1:x2]
            # 创建ROI前景和背景
            roi_bakground = cv2.bitwise_and(roi, roi, mask=mask_inv)
            roi_foreground = cv2.bitwise_and(img, img, mask=mask)

            # roi_bakground 与 roi_foreground 加和获取结果
            res = cv2.add(roi_bakground, roi_foreground)
            roi_color[y1:y2, x1:x2] = res

            break
    # 显示结果
    cv2.imshow('Snapchat-based OpenCV moustache overlay', frame)

    # 按下 “q” 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
video_capture.release()
cv2.destroyAllWindows()

眼镜挂件融合

在这一实战程序中,我们将学习在检测到的面部眼睛区域上融合眼镜挂件。我们通过下图首次查看程序预期结果:

同样为了实现眼镜挂件融合,需要首先使用眼睛检测器检测图像中的眼睛:

eyepair_cascade= cv2.CascadeClassifier("haarcascade_mcs_eyepair_big.xml")

上图中青色矩形表示检测到的人脸在图像中的位置和大小;粉红色矩形表示图像中检测到的眼睛;黄色矩形表示眼镜将被覆盖的位置,其根据眼睛所在区域的位置和大小进行计算。

同时,为融合的眼镜眼镜挂件图像增加一些透明度,以使它们更逼真,眼镜图像蒙版如下所示:

融合后的结果图像如下图所示:

完整代码

基本代码与上例相同,因此不再进行赘述,需要注意的是“眼镜”挂件的融合区域计算。

import cv2

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eyepair_cascade = cv2.CascadeClassifier("haarcascade_mcs_eyepair_big.xml")

img_glasses = cv2.imread('glasses.png', -1)
img_glasses_mask = img_glasses[:, :, 3]
img_glasses = img_glasses[:, :, 0:3]

video_capture = cv2.VideoCapture(0)

while True:
    ret, frame = video_capture.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]

        # 在检测到的人脸中检测眼睛
        eyepairs = eyepair_cascade.detectMultiScale(roi_gray)

        for (ex, ey, ew, eh) in eyepairs:
            # 计算“眼睛”挂件放置的坐标
            x1 = int(ex - ew / 10)
            x2 = int((ex + ew) + ew / 10)
            y1 = int(ey)
            y2 = int(ey + eh + eh / 2)

            if x1 < 0 or x2 < 0 or x2 > w or y2 > h:
                continue

            # 计算“眼睛”挂件放置区域大小
            img_glasses_res_width = int(x2 - x1)
            img_glasses_res_height = int(y2 - y1)

            mask = cv2.resize(img_glasses_mask, (img_glasses_res_width, img_glasses_res_height))
            mask_inv = cv2.bitwise_not(mask)
            img = cv2.resize(img_glasses, (img_glasses_res_width, img_glasses_res_height))

            roi = roi_color[y1:y2, x1:x2]
            roi_bakground = cv2.bitwise_and(roi, roi, mask=mask_inv)
            roi_foreground = cv2.bitwise_and(img, img, mask=mask)

            res = cv2.add(roi_bakground, roi_foreground):
            roi_color[y1:y2, x1:x2] = res

            break

    # 显示结果画面
    cv2.imshow('Snapchat-based OpenCV glasses filter', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

以上就是Python实战之基于OpenCV的美颜挂件制作的详细内容,更多关于Python OpenCV的内容请关注我们其它相关文章!

(0)

相关推荐

  • python基于Opencv实现人脸口罩检测

    一.开发环境 python 3.6.6 opencv-python 4.5.1 二.设计要求 1.使用opencv-python对人脸口罩进行检测 三.设计原理 设计流程图如图3-1所示, 图3-1 口罩检测流程图 首先进行图片的读取,使用opencv的haar鼻子特征分类器,如果检测到鼻子,则证明没有戴口罩.如果检测到鼻子,接着使用opencv的haar眼睛特征分类器,如果没有检测到眼睛,则结束.如果检测到眼睛,则把RGB颜色空间转为HSV颜色空间.进行口罩区域的检测.口罩区域检测流程是首先把

  • python计算机视觉OpenCV库实现实时摄像头人脸检测示例

    目录 设备准备: 实现过程 调用模型库文件 打开摄像头 人脸检测 设置退出机制 程序运行 全部代码 OpenCV 是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块.在Python中常使用OpenCV库实现图像处理. 本文将介绍如何在Python3中使用OpenCV实现实时摄像头人脸检测: 设备准备: USB摄像头 接入PC电脑USB口,并调试正常打开视频.如果电脑内置了电脑摄像头,测试一下摄像头能否正常使用. 下载特征分类模型: XM

  • 用Python做个个性的动画挂件让桌面不单调

    目录 前言 一.核心功能设计 二.实现步骤 1. 解析提取,修改图片 2.初始化动画挂件 3.动画挂件功能实现 4.打包配置 前言 前段时间,写了篇博客自己用python做的一款超炫酷音乐播放器.有粉丝问我,音乐播放器为什么要用PyQt5,效果是不是比Tkinter赞?PyQt5真的可以实现这些炫酷的UI画面吗?之前没接触过PyQt5,能不能多分享一些这方面的开发案例? 今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果! 下面,我们开始介绍这个

  • 基于python3+OpenCV实现人脸和眼睛识别

    基于python3+OpenCV的人脸和眼睛识别,供大家参考,具体内容如下 一.OpenCV人脸检测的xml文件下载 人脸检测和眼睛检测要用到haarcascade_eye.xml和haarcascade_frontalface_default.xml这两个文件,这两个文件可以在OpenCV的官网下载,具体下载方法如下: 1.打开要下载的xml文件,如下图: 2.点击Raw: 3.在新打开的网页中右击,选择另存为,最后保存就可以了. 二.人脸检测文件的导入以及图片的处理 接下来就可以在代码中载入

  • Python实战之基于OpenCV的美颜挂件制作

    目录 基于 Snapchat 的增强现实 胡子挂件融合 完整代码 眼镜挂件融合 完整代码 基于 Snapchat 的增强现实 胡子挂件融合 第一个项目中,我们将在检测到的脸上覆盖了一个小胡子.我们可以使用从摄像头捕获的连续视频帧,也可以使用单张测试图像.在进行实际讲解程序的关键步骤前,首先查看应用程序预期输出的结果图像: 项目的第一步是检测图像中的人脸.如上图所示,使用青色矩形绘制图像中检测到的人脸的位置和大小:接下来迭代图像中所有检测到的人脸,在其区域内搜索鼻子,粉红色矩形表示图像中检测到的鼻

  • Python机器视觉之基于OpenCV的手势检测

    目录 1 简介 2 传统机器视觉的手势检测 2.1 轮廓检测法 2.2 算法结果 2.3 整体代码实现 3 深度学习方法做手势识别 3.1 经典的卷积神经网络 3.2 YOLO系列 3.3 SSD 3.4 实现步骤 3.5 关键代码 4 实现手势交互 1 简介 今天学长向大家介绍一个机器视觉项目 基于机器视觉opencv的手势检测 手势识别 算法 2 传统机器视觉的手势检测 普通机器视觉手势检测的基本流程如下: 其中轮廓的提取,多边形拟合曲线的求法,凸包集和凹陷集的求法都是采用opencv中自带

  • python目标检测基于opencv实现目标追踪示例

    目录 主要代码 信息封装类 更新utils python-opencv3.0新增了一些比较有用的追踪器算法,这里根据官网示例写了一个追踪器类 程序只能运行在安装有opencv3.0以上版本和对应的contrib模块的python解释器 主要代码 #encoding=utf-8 import cv2 from items import MessageItem import time import numpy as np ''' 监视者模块,负责入侵检测,目标跟踪 ''' class WatchDo

  • Python基于opencv调用摄像头获取个人图片的实现方法

    接触图像领域的应该对于opencv都不会感到陌生,这个应该算是功能十分强劲的一个算法库了,当然了,使用起来也是很方便的,之前使用Windows7的时候出现多该库难以安装成功的情况,现在这个问题就不存在了,需要安装包的话可以去我的资源中下载使用,使用pip安装方式十分地便捷. 今天主要是基于opencv模块来调用笔记本的内置摄像头,然后从视频流中获取到人脸的图像数据用于之后的人脸识别项目,也就是为了构建可用的数据集.整个实现过程并不复杂,具体如下: #!usr/bin/env python #en

  • Python实战之OpenCV实现猫脸检测

    开发工具 Python版本:3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 简单地讲一讲Haar分类器,也就是Viola-Jones识别器. 详细的原理说明可参考相关文件中的两篇论文: Rapid Object Detection using a Boosted Cascade of Simple Features; Robust Real-Time Face Detection. (1

  • 人脸检测实战终极之OpenCV+Python实现人脸对齐

    目录 前言 实现面部矫正器 导入必要的包 对齐人脸 展示结果 前言 这篇博文的目的是演示如何使用 OpenCV.Python 和面部标志对齐人脸. 给定一组面部标志(输入坐标),我们的目标是将图像扭曲并转换为输出坐标空间. 在这个输出坐标空间中,整个数据集中的所有面都应该: 在图像中居中. 旋转,使眼睛位于水平线上(即,旋转面部,使眼睛位于相同的 y 坐标上). 进行缩放,使面的大小大致相同. 为此,我们将首先调用一个实现的 Python 类FaceAligner ,以使用仿射变换对齐人脸. 注

  • Python基于OpenCV实现人脸检测并保存

    本文实例为大家分享了Python基于OpenCV实现人脸检测,并保存的具体代码,供大家参考,具体内容如下 安装opencv 如果安装了pip的话,Opencv的在windows的安装可以直接通过cmd命令pip install opencv-python(只需要主要模块),也可以输入命令pip install opencv-contrib-python(如果需要main模块和contrib模块) 详情可以点击此处 导入opencv import cv2 所有包都包含haarcascade文件.这

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

  • Python基于opencv实现的简单画板功能示例

    本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true if mouse is pressed ix,iy = -1,-1 def nothing(x): pass # mouse callback function def draw_circle(event,x,y,flags,param): global ix,iy,drawing g = par

  • Python基于opencv的图像压缩算法实例分析

    本文实例讲述了Python基于opencv的图像压缩算法.分享给大家供大家参考,具体如下: 插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值. 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小.若设定 ROI,函数将按

随机推荐