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 os


def 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.pi
                angle = 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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 06:44:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 06:44:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 06:44:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 06:44:01       20 阅读

热门阅读

  1. arco.design重写message实现只提示一次错误的功能

    2024-04-30 06:44:01       10 阅读
  2. SQL LPAD函数使用

    2024-04-30 06:44:01       13 阅读
  3. RTCRTC

    2024-04-30 06:44:01       8 阅读
  4. golang垃圾回收

    2024-04-30 06:44:01       11 阅读
  5. Linux 系统中如何将网卡设置为桥接模式

    2024-04-30 06:44:01       10 阅读