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

embedded/2024/9/18 23:12:57/ 标签: python, 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、具体代码

python">"""
简单进行嘴巴检测并添加特效的功能实现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.ppmy.cn/embedded/24325.html

相关文章

有趣的大模型之我见 | Llama AI Model

Llama 开源吗? 我在写《有趣的大模型之我见 | Mistral 7B 和 Mixtral 8x7B》时曾犹豫,在开源这个事儿上,到底哪个大模型算鼻祖?2023 年 7 月 18 日,Meta 推出了最受欢迎的大型语言模型(LLM)的第…

JVM调优

行性能监控和故障处理指令 操作系统工具 top:显示系统整体资源使用情况vmstat:监控内存和CPUiostat:监控IO使用netstat:监控网络使用JDK性能监控工具 jps:虚拟机进程查看jstat:虚拟机运行时信息查看jinfo&…

Facebook的声音:听见社交媒体的心跳

社交媒体如今已经成为人们日常生活中不可或缺的一部分,而Facebook作为其中的佼佼者,承载着数以亿计的用户的交流、分享和连接。在这个信息爆炸的时代,Facebook的声音就像是社交媒体的心跳,传递着无数个体的情感、思想和生活。本文…

【算法每日一练】动态规划,图论(换根dp)会议 ,医院设置

目录 题目: 会议 思路: 题目:医院设置 思路: 题目: 会议 思路: 首先,阅读题目可以看出来,这道题目实际上就是求树的重心。 树的重心: 定义:找到一个点&a…

【unocss】自用

unocss中文官网1 不知道简写的可以在这里查 第一步 npm install -D unocss第二步 // vite.config.ts import UnoCSS from unocss/vite import { defineConfig } from viteexport default defineConfig({plugins: [UnoCSS()] })// main.ts import virtual:uno.css第三步 在…

C#算法之希尔排序

算法释义:希尔排序,也被称为缩小增量排序,是一种有效的排序算法,它是插入排序的一种更高效的改进版,通过比较一定间隔的元素来工作,然后逐步较少间隔来排序。 小编的理解啊,希尔排序的本质就是不…

【模板】最近公共祖先(LCA)

树的简介 树常见用来表示家族谱的家族关系,他像一个倒着的树。他的构成为: 根节点( r o o t root root ): 所有节点都由一个 根节点( r o o t root root ) ,且只有一个 根节点&a…

LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)

LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab) 目录 LSTM-KDE的长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.LSTM-KDE的长短期…

数据集市与数据仓库

一、概念 数据仓库(Data Warehouse)和数据集市(Data Mart)是企业中用于存储和管理数据的两种常见架构。它们在设计和应用上有一些区别,下面我简要介绍一下: 数据仓库(Data Warehouse&#xff0…

基于Python的相片批量添加边框水印程序

目录 一、前言 二、介绍 三、使用办法 四、代码 五、图例 原图 Style1输出 Style2输出 Style3输出 佳能照片输出样例(Style1) 大疆照片输出样例(Style1) 苹果照片输出样例(Style1) 一、前言 对…

排序算法-桶排序

一、桶排序 它同样是一种线性时间的排序算法,它类似于计数排序所创建的统计数组,桶排序需要创建若干个桶来协助排序。 每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素。 如果有一个非整数数列如: 4.5&a…

个人学习资源整理

文章目录 视频相关stl源码讲解相关 网站相关CPP网站 视频相关 stl源码讲解相关 跳转 网站相关 CPP网站 https://cplusplus.com/ https://gcc.gnu.org/

python代码实现线性回归

1、导入第三方库 import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split import numpy as np2、生成数据集 def generateData():X []y []for i in range(0, 100):tem_x []tem_x.appe…

Deckset for Mac激活版:MD文档转幻灯片软件

Deckset for Mac是一款专为Mac用户打造的Markdown文档转幻灯片软件。它凭借简洁直观的界面和强大的功能,成为许多用户的心头好。 Deckset for Mac激活版下载 Deckset支持Markdown语法,让用户在编辑文档时无需分心于复杂的格式设置,只需专注于…

Meta的AI潮流:创新还是用户体验的噩梦?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏:《体验AI》 期待您的点赞👍收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

深入了解iOS内存(WWDC 2018)笔记-内存诊断

主要记录下用于分析iOS/macOS 内存问题的笔记。 主要分析命令: vmmap, leaks, malloc_history 一:前言 有 3 种思考方式 你想看到对象的创建吗?你想要查看内存中引用对象或地址的内容吗?或者你只是想看看 一个实例有多大&#…

Linux网络之DNS域名解析

一、DNS概述 1.1什么是DNS 域名解析协议,将域名转换成IP地址 1.2为什么要用DNS IP地址不便于记忆,DNS使用户可以通过易记的域名快速访问各种网络资源。 192.168.0.0—— ip地址过长而且都是数字,不方便记忆就出现了域名 www.baidu.com—…

Build a Large Language Model (From Scratch) 从头开始构建大型语言模型(第三章)学习笔记

构建大型语言模型(从头开始) 3 编码注意力机制(Coding Attention Mechanisms)3.1 长序列建模问题(The problem with modeling long sequences) 3 编码注意力机制(Coding Attention Mechanisms&a…

共享办公工位租赁指南

随着现代工作模式的演变,共享办公空间已经成为企业和个人寻求灵活、经济办公解决方案的热门选择。 一、评估自己的团队需求 在开始寻找共享办公空间之前,首先明确自己的团队规模。小型团队或独立工作者可能更适合开放式工位,而中大型团队可能…