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

news/2024/9/18 23:15:50/ 标签: 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/news/1444704.html

相关文章

​基于Python的在线自主评测系统(django)​

基于Python的在线自主评测系统(django) 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 学生功能模块的实现 学生注册的实现 学生登录界面首页 在线考试界面 考试成绩查看界面 教师功能模块的实现 新建…

MyBatis(注解方式操作)

文章目录 1.注解方式操作文件目录1.快速入门(完整步骤)1.pom.xml(完整)2.resources/jdbc.properties外部配置文件(根据实际情况修改参数)3.在resources/mybatis-config.xml(完整)中配…

TCP协议在物联网中实战

一、TCP协议介绍 网上对TCP协议介绍众多,本人按照自己的理解简单介绍一下。 TCP(Transmission Control Protocol, 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输控制层通信协议。 1.1 协议机制 1.1.1 三次握手 &…

简要说说软分叉和硬分叉。

前言 一、软分叉 二、硬分叉 三、用途 总结 前言 软分叉和硬分叉是区块链技术中的两个重要概念,它们通常与加密货币的网络升级有关。下面我将分别解释这两个概念,并提供一些例子来帮助理解。下面是方便理解软分叉和硬分叉的图 一、软分叉 软分叉是一…

有趣的 CSS 图标整合技术!sprites精灵图,css贴图定位

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合…

使用Mac报Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ 原因:无法在设置中开启mysql 在终端输入sudo /usr/local/mysql/support-files/mysql.server start,输入密码可以重新开启Mysql sudo ln -s /Applications/MAMP/Library/bin/my…

大数据学习笔记14-Hive基础2

一、数据字段类型 数据类型 :LanguageManual Types - Apache Hive - Apache Software Foundation 基本数据类型 数值相关类型 整数 tinyint smallint int bigint 小数 float double decimal 精度最高 日期类型 date 日期 timestamps 日期时间 字符串类型 s…

蓝牙核心规范(core Specification)与应用规范(Profile)

加zkhengyang可申请加入蓝牙音频研究开发交流答疑群(课题组),赠送实际蓝牙耳机项目核心开发资料, 我们看到的大部分资料对于蓝牙协议分层一般是核心规范。 射频,基带,链路管理属于蓝牙硬件模块(一般由硬件实现比如FPGA) 逻辑链…

hutool工具导入excel

Hutool是一个Java工具类库,它提供了一系列实用的API,包括操作Excel的功能。要使用Hutool导入Excel,你可以使用ExcelReader类。以下是一个简单的例子,展示了如何使用Hutool导入Excel文件: import cn.hutool.poi.excel.…

小程序地理位置接口怎么开通?

小程序地理位置接口有什么功能? 如果我们提审后驳回理由写了“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通,建议完成接口开通后或移除接口相关内容后再进行后续版本提审”,如果你也碰到类似问题&#xf…

QT 开发COM(ActiveX)组件基础介绍和方案验证

一、COM简介 1.1 COM是什么? COM,Component Object Model,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范,也…

使用Arduino开发板和ESP8266从互联网读取数据

要使用Arduino开发板和ESP8266模块从互联网读取数据,你需要完成几个步骤,包括硬件准备、软件配置、编程和调试。以下是这个过程的概述,以及相关的代码示例。 硬件准备 Arduino开发板:任何兼容的Arduino板,如Arduino …

【Python网络爬虫】python爬虫用正则表达式进行数据清洗与处理

🔗 运行环境:PYTHON 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

【笔记】Python3|2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果(汇总)

文章目录 PDF2HTML_Samples1 测评过程2 评估方式3 结果说明4 测评列表 PDF2HTML_Samples 目的是对比一下常用的 PDF 转 HTML/XML 的工具。 整个对比过程放在了 Github 仓库中, 欢迎提交 PR/Issue 补充更多工具:https://github.com/shandianchengzi/PDF…

2024.04.10校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 蔚来校招 硬核造车,等你投递(内推) 校招 | 蔚来校招 硬核造车,等你投递(内推) 2、校招 | 华大半导体2024…

R语言 数据整理篇之结构重塑

《Cookbook for R》Manipulating Data ~ Restructuring 数据整理篇之数据结构重塑 Converting between data frames and contingency tables 在数据框和列联表之间转换 表示同样的内容但是三种不同的表现形式: 1、呈现个案观测值的数据框 cases :每行代…

使用 Ant Design Vue踩过的那些坑

一些头脑不清醒的吐槽:真的没有人觉得Ant Design Vue很难用吗???官方文档很拉跨啊???难道是我道行太浅??? 仅以此博客记录使用 Ant Design Vue踩过的那些坑#&…

邦注科技即热式节能模温机 模温机的工作原理

模温机是一种用于控制模具温度的设备,主要用于塑料注塑、压铸、橡胶成型等工艺中。 其工作原理主要包括以下几个步骤: 加热阶段: 当模具需要加热时,双温模温机会启动加热系统,将热传导油或热传导水加热至设定温度。加…

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

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

Android --- 网络请求

通常在 Android 中进行网络连接一般使用 Scoket 和HTTP,HTTP 请求方式比 Scoket 多。HTTP 请求一般采用原生的 HttpClient 和 HttpUrlConnection 的两种网络访问方式(系统自带的)。但是在 Android 5.0 的时候 Google 就不推荐使用 HttpClient…