Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现

一、简单介绍

二、简单进行嘴巴检测并添加特效的功能实现原理方法

实现原理:

实现方法:

三、简单进行嘴巴检测并添加特效的功能实现简单步骤

四、注意事项

五、源码下载地址


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

OpenCV 提供了一些已经训练好的级联分类器,这些级联分类器以XML文件的方式保存在以下路径中:

...\Python\Lib\site-packages\cv2\data\

OpenCV提供了一些经过预训练的人脸检测器模型文件,这些文件通常包含在OpenCV的安装包中。你也可以在OpenCV的官方GitHub页面或者OpenCV官方网站的下载页面找到这些模型文件的下载链接。

一般来说,你可以从以下位置获取OpenCV的预训练模型文件:

  •   OpenCV GitHub Release 页面:在 Releases · opencv/opencv · GitHub 找到你需要的版本,然后在下载的压缩包中找到位于 opencv\data 目录下的人脸检测器模型文件。
  •  OpenCV 官方网站下载页面:访问 OpenCV 官方网站 Releases - OpenCV ,下载你需要的版本,并在相应的压缩包中查找人脸检测器模型文件。

请确保下载与你使用的OpenCV版本兼容的模型文件。

该案例效果

二、简单进行嘴巴检测并添加特效的功能实现原理方法

检测人脸、眼睛和嘴巴,并在视频中给人脸添加嘴巴特效是一种计算机视觉应用,通常使用图像处理和机器学习技术来实现。这个过程通常包括以下步骤:

  1. 人脸检测:通过级联分类器或深度学习模型等方法,检测视频帧中的人脸位置。常用的方法包括 Haar 级联检测器、基于深度学习的人脸检测器(如MTCNN、Dlib中的HOG特征检测器、OpenCV的深度学习人脸检测器等)。

  2. 眼睛检测:在检测到的人脸区域内,进一步检测眼睛的位置。这通常通过在人脸区域内应用眼睛检测器(如Haar级联检测器、深度学习模型等)来实现。

  3. 嘴巴检测:类似地,在人脸区域内,检测嘴巴的位置。同样可以使用级联分类器或深度学习模型进行嘴巴的检测。

  4. 特效添加:在检测到的人脸、眼睛和嘴巴位置上,添加相应的特效。这可能包括在嘴巴位置覆盖一个特定的图像或动态效果,例如嘴唇颜色的改变、嘴巴形状的变换等。

  5. 调整特效:根据需要,可能需要对添加的特效进行一些调整,如旋转、缩放或者根据检测到的位置进行微调,以使特效与人脸的姿势和表情保持一致。

这个过程需要对图像处理、机器学习和计算机视觉技术有一定的理解和掌握,并且需要进行参数调整和优化,以确保检测和特效添加的准确性和稳定性。

当检测人脸、眼睛和嘴巴,在视频中给人脸添加嘴巴特效的功能实现时,可以按照以下步骤进行:

实现原理:

  1. 人脸检测:使用 Haar 级联检测器来检测视频帧中的人脸区域。

  2. 眼睛检测:在人脸区域内进行眼睛检测,以便后续计算特效的偏转角度。

  3. 嘴巴检测:同样在人脸区域内进行嘴巴检测,以确定添加嘴巴特效的位置。

  4. 特效添加:根据检测到的眼睛位置计算偏转角度,并根据检测到的嘴巴位置调整特效的位置。然后将特效添加到视频帧的相应位置上。

实现方法:

  1. 使用 OpenCV 提供的 Haar 级联检测器进行人脸、眼睛和嘴巴检测。

  2. 通过检测到的眼睛位置计算偏转角度,以使特效与眼睛保持一致的方向。

  3. 根据检测到的嘴巴位置,将特效添加到合适的位置上。可以通过调整特效图片的大小和旋转来适应嘴巴的形状和方向。

该案例在实现检测人脸、眼睛和嘴巴,并给人脸添加嘴巴特效的功能中,涉及到了一些关键函数,这些函数在实现过程中发挥了重要作用。以下是这些关键函数的说明:

  1. cv2.CascadeClassifier()

    • 作用:加载 Haar 级联检测器模型。
    • 参数:接受一个 XML 文件路径作为参数,该文件包含了训练好的级联分类器的配置。
    • 返回值:返回一个级联分类器对象,可以用于人脸、眼睛、嘴巴等目标的检测。
  2. cv2.VideoCapture()

    • 作用:打开视频文件或者捕获设备的视频流。
    • 参数:接受一个视频文件路径或者设备索引作为参数。
    • 返回值:返回一个视频捕获对象,可以用于逐帧读取视频内容。
  3. cv2.cvtColor()

    • 作用:将图像从一个颜色空间转换到另一个颜色空间。
    • 参数:接受待转换的图像和转换类型作为参数。
    • 返回值:返回转换后的图像。
  4. cv2.rectangle()

    • 作用:在图像上绘制矩形框。
    • 参数:接受待绘制的图像、矩形框的左上角和右下角坐标、颜色、线条粗细等参数。
    • 返回值:绘制矩形框后的图像。
  5. cv2.resize()

    • 作用:调整图像大小。
    • 参数:接受待调整的图像和目标尺寸作为参数。
    • 返回值:返回调整大小后的图像。
  6. cv2.getRotationMatrix2D()

    • 作用:获取图像旋转的变换矩阵。
    • 参数:接受旋转中心点、旋转角度和缩放因子作为参数。
    • 返回值:返回一个 2x3 的变换矩阵。
  7. cv2.warpAffine()

    • 作用:对图像进行仿射变换。
    • 参数:接受待变换的图像和变换矩阵作为参数。
    • 返回值:返回变换后的图像。
  8. cv2.imshow()

    • 作用:在窗口中显示图像。
    • 参数:接受窗口名称和待显示的图像作为参数。
    • 返回值:无。
  9. cv2.waitKey()

    • 作用:等待用户按键输入。
    • 参数:接受一个等待时间(毫秒)作为参数,若为 0 则表示无限等待。
    • 返回值:返回用户按键的 ASCII 码。
  10. cap.release()cv2.destroyAllWindows()

    • 作用:释放视频捕获对象和关闭所有 OpenCV 窗口。
    • 参数:无。
    • 返回值:无。

这些函数在视频特效添加的过程中发挥了关键作用,通过它们的组合和调用,实现了人脸、眼睛和嘴巴的检测,并在检测到的人脸上添加了相应的特效。

如果通过眼睛计算的偏转角度不够准确,可以尝试以下方法进行处理:

  •         使用更准确的角度计算方法:眼睛中心的斜率可能不是最准确的角度计算方法。考虑使用更精确的方法来计算角度,例如通过计算两个眼睛中心的连线与水平线的夹角来确定偏转角度。
  •         使用更多的特征点:除了眼睛的中心点,还可以考虑使用更多的特征点来计算偏转角度,例如眼睛的角点或眉毛的位置。通过综合考虑多个特征点的位置和方向,可以更准确地估计人脸的偏转角度。
  •         引入平滑处理:考虑对计算出的角度进行平滑处理,例如使用滑动窗口或滤波器来平均多个帧的角度值,以减少突变和不稳定性。
  •         调整参数:尝试调整眼睛检测算法的参数,例如缩放因子、邻近点数量和最小尺寸,以获取更准确的眼睛检测结果。
  •         使用机器学习方法:考虑使用机器学习方法,例如深度学习模型,通过大量数据训练来学习人脸的姿态和偏转角度,以提高预测准确性。

通过以上方法的组合或单独应用,可以更准确地计算人脸的偏转角度,从而改善通过眼睛计算的偏转角度的准确性。

三、简单进行嘴巴检测并添加特效的功能实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单进行嘴巴检测并添加特效的功能实现1、使用 OpenCV 提供的 Haar 级联检测器进行人脸、眼睛和嘴巴检测。2、通过检测到的眼睛位置计算偏转角度,以使特效与眼睛保持一致的方向。3、根据检测到的嘴巴位置,将特效添加到合适的位置上。可以通过调整特效图片的大小和旋转来适应嘴巴的形状和方向。
"""import cv2
import numpy as np
import osdef detect_and_add_mouth_effect(video_path, mouth_effect_image_path, mouth_scale_factor=2.5, mouth_min_neighbors=30, mouth_min_size=(20, 20),mouth_offset_x=0, mouth_offset_y=0):"""通过检测人脸、眼睛和鼻子,在视频中给人脸添加嘴巴特效:param video_path: 视频文件路径:param mouth_effect_image_path: 嘴巴特效图片文件路径:param mouth_scale_factor: 嘴巴检测器的缩放因子:param mouth_min_neighbors: 嘴巴检测器的最小邻居数:param mouth_min_size: 嘴巴检测器的最小尺寸:param mouth_offset_x: 嘴巴特效在水平方向的偏移量:param mouth_offset_y: 嘴巴特效在垂直方向的偏移量:return:"""# 检查视频文件路径是否存在if not os.path.exists(video_path):print("Error: 视频文件路径不存在!")return# 检查嘴巴特效图片文件路径是否存在if not os.path.exists(mouth_effect_image_path):print("Error: 嘴巴特效图片文件路径不存在!")return# 加载人脸、眼睛和鼻子检测器face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')# nose_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_nose.xml')mouth_cascade = cv2.CascadeClassifier('haarcascade/haarcascade_mcs_mouth.xml')# 加载嘴巴特效图片mouth_effect = cv2.imread(mouth_effect_image_path, cv2.IMREAD_UNCHANGED)# 打开视频文件cap = cv2.VideoCapture(video_path)while True:# 读取一帧视频ret, frame = cap.read()if not ret:break# 将视频帧转换为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人脸检测faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 遍历检测到的人脸for (x, y, w, h) in faces:# 在人脸区域绘制矩形框# cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)# 在人脸区域检测眼睛roi_gray = gray[y:y + h, x:x + w]eyes = eye_cascade.detectMultiScale(roi_gray, scaleFactor=1.35, minNeighbors=15, minSize=(20, 20))if len(eyes) >= 2:# 计算两个眼睛的中心位置eye_centers = np.array([(x + ex + ew // 2, y + ey + eh // 2) for (ex, ey, ew, eh) in eyes])# 计算眼睛中心线的斜率slope = (eye_centers[1][1] - eye_centers[0][1]) / (eye_centers[1][0] - eye_centers[0][0])# 计算角度angle = np.arctan(slope) * 180 / np.piangle = np.clip(angle, -45, 45)  # 将角度限制在[-45, 45]范围内angle = -angle  # 取反,适应后面特效的旋转# 在画面上绘制眼睛的位置for (ex, ey, ew, eh) in eyes:# cv2.rectangle(frame, (x + ex, y + ey), (x + ex + ew, y + ey + eh), (0, 255, 0), 2)print("cv2.rectangle eye ")# 嘴巴检测mouth = mouth_cascade.detectMultiScale(roi_gray, scaleFactor=mouth_scale_factor, minNeighbors=mouth_min_neighbors, minSize=mouth_min_size)for (nx, ny, nw, nh) in mouth:# 在人脸区域绘制嘴巴矩形框# cv2.rectangle(frame, (x+nx, y+ny), (x+nx+nw, y+ny+nh), (255, 255, 0), 2)# 调整嘴巴特效图片的大小以适应嘴巴区域resized_mouth_effect = cv2.resize(mouth_effect, (nw, nh))# 计算嘴巴区域的中心点和旋转中心mouth_center = (int(x + nx + nw // 2) + mouth_offset_x, int(y + ny + nh // 2) + mouth_offset_y)rotation_center = (int((nx + nw) // 2), int((ny + nh) // 2))# 旋转嘴巴特效图片mouth_effect_rotated = cv2.warpAffine(resized_mouth_effect,cv2.getRotationMatrix2D(rotation_center, angle, 1), (nw, nh))# 在嘴巴位置上添加旋转后的特效图片for c in range(0, 3):frame[y + ny:y + ny + nh, x + nx:x + nx + nw, c] = \mouth_effect_rotated[:, :, c] * (mouth_effect_rotated[:, :, 3] / 255.0) + \frame[y + ny :y + ny + nh , x + nx:x + nx + nw, c] * (1.0 - mouth_effect_rotated[:, :, 3] / 255.0)# 显示结果cv2.imshow('Face and Features Detection', frame)# 检测按键输入key = cv2.waitKey(1)if key == ord('q'):  # 按 'q' 键退出break# 释放视频捕获对象cap.release()cv2.destroyAllWindows()def main():# 使用示例video_path = 'Videos/GirlFace.mp4'mouth_effect_image_path = 'Images/mouth.png'detect_and_add_mouth_effect(video_path, mouth_effect_image_path, mouth_offset_x=10, mouth_offset_y=20)  # 例:向右移动10像素,向下移动20像素if __name__ == "__main__":main()

四、注意事项

  1. 检测器选择:选择适合任务的 Haar 级联检测器,确保它们足够准确地检测到人脸、眼睛和嘴巴。

  2. 参数调整:根据实际情况调整检测器的参数,例如缩放因子、最小邻居数和最小尺寸,以在不同场景下获得更好的检测效果。

  3. 特效适配:确保特效图片的大小和形状与检测到的嘴巴区域相匹配,否则需要进行相应的调整,以避免特效显示不正确或变形。

  4. 性能优化:在处理视频时,要考虑到性能问题,可以采用一些优化策略,例如使用多线程处理、减小特效图片的分辨率等,以提高程序的运行效率。

五、源码下载地址

github:GitHub - XANkui/PythonOpencvBeginnerPracticalDemo

案例代码:Opencv人脸检测人脸识别/10Cv2FaceMouthDetectAddEffect.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Installer 运行python 汉字

问题描述: Visual Studio Installer 在正常情况下运行python文件时时候, 不能编译中文注释,更不能输出中文。 解决方法: 在程序开头下面这一行即可。 #coding:GBK 原因及解释: #coding:GBK 是 Python 源文件中的一个…

ceph 1 pool(s) do not have an application enabled

查看 ceph 状态 cluster:id: 58f90b9a-155c-43cf-98af-54cb611fc8e0health: HEALTH_OKservices:mon: 3 daemons, quorum a,b,d (age 79m)ne>mgr: b(active, since 59m), standbys: ane>mds: 1/1 daemons up, 1 hot standbyne>osd: 6 osds: 6 up (since 79m), 6 in…

ArcGIS小技巧—模型构建器快速提取河网

上篇文章介绍的基于DEM的河网提取,需要使用多个工具,整体操作比较繁琐,在日常工作中,使用Arcgis提供的模型构建器可以帮助我们将多个工具整合在一起,在面对大量数据批量处理时,可以大大提高工作效率 利用模…

Python基本数据类型

描述 Python是一种高级编程语言,拥有丰富的数据类型用于表示不同类型的数据。基本数据类型可以分为数值型(Numbers)、字符串型(Strings)、布尔型(Booleans)、空值(NoneType&#xff…

8、Flink 在 source 处生成水位线 和 在 source 之后生成水位线案例

1、AtSourceGenerateWatermark 注意:从 Flink 1.17开始,FLIP-27 源框架支持拆分级别的水印对齐。 import java.time.Duration;public class _02_AtSourceGenerateWatermark {public static void main(String[] args) throws Exception {StreamExecution…

摇杆控制电机

参考: 摇杆电位器控制步进电机正反转调速-Arduino中文社区 - Powered by Discuz! 一个基于树莓派和Python的无人机视觉跟踪系统_ 北漠苍狼的专栏(QQ:1746430162)-CSDN博客

数字化wms仓库管理软件,实现企业仓储信息共享与智慧运行-亿发

在经济飞速发展的今天,企业面临着客户需求多样化、质量和交期要求提高以及激烈的市场竞争等挑战。在这样的背景下,许多企业开始考虑采用数字化仓储WMS系统来解决这些问题。 数字化仓储WMS系统通过打造高效、规范的仓库管理体系,实现了对产品…

爱普生晶振在物联网LoRa通讯中的应用

LoRa 是LPWAN通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式,为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统,进而扩展传感网络…

【Spring】2.Spring中Bean的生命周期管理及定义

在Spring框架中,Bean是一个被Spring IoC容器实例化、组装和管理的对象。Bean就是Spring应用中的对象,它们形成了Spring应用的骨干。Spring IoC容器负责创建Bean,配置Bean以及管理Bean的完整生命周期。 Bean的生命周期 实例化Bean&#xff1a…

神经网络高效训练:优化GPU受限环境下的大规模CSV数据处理指南

最近训练模型,需要加载wifi sci data 数据量特别大,直接干爆内存,训练也特别慢,快放弃了!随后冷静下来,然后靠着多年的经验,来进行层层优化,随诞生了这篇博客。 背景介绍 机器学习模型的训练通常需要大量的数据,尤其是对于深度神经网络模型。然而,当数据集非常庞大时…

网络之路29:三层链路聚合

正文共:1666 字 17 图,预估阅读时间:3 分钟 目录 网络之路第一章:Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章:认识企业设备…

wow_iot模块说明

wow_iot模块说明 wow_iot模块主要用于系统关联与基础接口封装库的实现,以供其它库文件与可执行文件调用,主要涉及algorith算法模块、config配置模块、database数据库模块、plugin插件模块、encode编码模块、encrypt加密模块、hash哈希模块、protocol协议…

愚安科技安全工程师面经:

1自我介绍 2讲项目经历 3“”符号(反单引号)在PHP语言以及SQL语言中的作用分别是什么 4Java中的反射有什么作用 5Java反序列化的基本原理 6 SSRF漏洞有什么漏洞利用思路? 7 利用XSS漏洞可以达到什么效果?有哪些防御XSS漏洞的手段/…

新质生产力实践,我用chatgpt开发网站

是的,我用chatgpt开发了一个网站,很轻松。 我之前一点不懂前端,也没有网站开发的代码基础,纯正的0基础。 从0开始到最后成品上线,时间总计起来大致一共花了2-3周的时间。 初始想法我是想给我公司开发一个网站&#…

【弱监督语义分割】AllSpark:从transformer中的未标记特征重生标记特征,用于半监督语义分割

AllSpark: Reborn Labeled Features from Unlabeled in Transformer for Semi-Supervised Semantic Segmentation 摘要: 目前最先进的方法是用真实标签训练标注数据,用伪标签训练未标注数据。然而,这两个训练流程是分开的,这就使…

mybatis - XxxMapper.java接口中方法的参数 和 返回值类型,怎样在 XxxMapper.xml 中配置的问题

这个例子中的mybatis-config.xml文件,引用这个文件即可 实体类src/main/java/com.atguigu.pojo/Employee.java package com.atguigu.pojo;public class Employee {private Integer id;private String name;private String plone;public Integer getId() {return i…

Android数据恢复:如何在手机上恢复丢失的文件和照片

我们都有 我们错误地从手机中删除重要内容的时刻。确实如此 不一定是我们的错。其他人可以对您的手机数据执行此操作 有意或无意。这在某个时间点发生在我们所有人身上。 但是,今天市场上有各种各样的软件可以 帮助恢复已删除的文件。这些类型的软件被归类为数据恢复…

OceanBase 分布式数据库【信创/国产化】- OceanBase 数据库整体架构

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 数据库整体架构前言OceanBase 数据更新架构OceanBase 数据库采用 Shared-Nothing 架构OceanBase 分布式数据库【信创/国产化】- OceanBase 数据库整体架构 编辑 | 简简单单 Online zuozuo 地址…

linux 修改hosts文件新增域名映射

1、 切换到root账号 su - root 2、 输入root密码 xxxxxx 3、 进入hosts文件 vi /etc/hosts 4、 输入i进入新增模式 i 5、写入新的 127.0.0.1 rm-8123456789k7x6zr6.mysql.sss 6、保存退出 按下esc (确保你在命令模式:按下Esc键确保你处于正…

Pandas数据可视化 - Matplotlib、Seaborn、Pandas Plot、Plotly

可视化工具介绍 让我们一起探讨Matplotlib、Seaborn、Pandas Plot和Plotly这四个数据可视化库的优缺点以及各自的适用场景。这有助于你根据不同的需求选择合适的工具。 1. Matplotlib 优点: 功能强大:几乎可以用于绘制任何静态、动画和交互式图表。高度可定制&a…