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官方网站的下载页面找到这些模型文件的下载链接。

二、简单人脸眼睛检测添加睫毛效果实现原理

人脸眼睛检测是计算机视觉中的一项任务,旨在识别图像或视频中的人脸和眼睛。这项技术通常涉及以下步骤:

通过将这些步骤组合在一起,可以实现人脸眼睛检测和添加眼睛特效的功能,从而为图像或视频增添趣味性或美化效果。

案例代码实现了在人脸图像中检测左眼,并在左眼上方添加睫毛效果的功能。以下是其实现的原理、具体步骤:

案例代码涉及的关键函数如下:

三、简单人脸眼睛检测添加睫毛效果案例实现简单步骤

1、编写代码

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果-LMLPHP

2、运行效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果-LMLPHP

3、具体代码

"""
简单人脸眼睛检测添加睫毛效果
    1、加载人脸和眼睛检测器。
    2、读取输入的人脸图像,并对其进行灰度化处理。
    3、使用人脸检测器检测人脸区域。
    4、对每个检测到的人脸区域,使用眼睛检测器检测眼睛。
    5、对每个检测到的眼睛,判断其是否为左眼,并获取其位置信息。
    6、如果是左眼,根据竖直方向的偏移参数调整睫毛的位置。
    7、将调整后的睫毛图像合成到原始图像中。
    8、返回添加了睫毛效果的图像。
"""

import cv2


def apply_eyelash_left_eye(image_path, eyelash_image_path, vertical_offset=0.0):
    """
    在人脸图像上添加左眼睫毛效果
    :param image_path: (str) 输入的人脸图像路径
    :param eyelash_image_path: (str) 睫毛图像的路径
    :param vertical_offset: (float) 睫毛竖直方向位置调节参数,范围为-1到1,默认值为0(中心位置)
    :return: numpy.ndarray 添加了睫毛效果的图像数据
    """

    # 参数安全性校验
    if not isinstance(image_path, str) or not image_path.strip():
        raise ValueError("Invalid input image path.")
    if not isinstance(eyelash_image_path, str) or not eyelash_image_path.strip():
        raise ValueError("Invalid eyelash image path.")
    if not (-1 <= vertical_offset <= 1):
        raise ValueError("Vertical offset parameter must be between -1 and 1.")

    # 读取图像
    image = cv2.imread(image_path)
    eyelash_image = cv2.imread(eyelash_image_path, cv2.IMREAD_UNCHANGED)

    # 加载人脸和眼睛检测器
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

    # 灰度化图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 对每个人脸进行操作
    for (x, y, w, h) in faces:
        # 提取人脸区域
        face_roi = image[y:y + h, x:x + w]
        gray_roi = gray[y:y + h, x:x + w]

        # 检测眼睛
        eyes = eye_cascade.detectMultiScale(gray_roi)

        # 画出左右眼范围的矩形框
        for (ex, ey, ew, eh) in eyes:
            eye_center = (x + ex + ew // 2, y + ey + eh // 2)
            cv2.rectangle(image, (x + ex, y + ey), (x + ex + ew, y + ey + eh), (255, 0, 0), 2)

            # 仅对左眼进行操作
            if eye_center[0] < x + w // 2:
                # 调整睫毛图像大小以匹配眼睛
                resized_eyelash = cv2.resize(eyelash_image, (ew, eh))

                # 调整睫毛竖直方向位置
                offset_y = int(eh * vertical_offset)
                ey = max(0, ey + offset_y)

                # 将睫毛图像合成到原始图像中
                for c in range(0, 3):
                    for i in range(eh):
                        for j in range(ew):
                            if resized_eyelash[i, j, 3] != 0:
                                image[y + ey + i, x + ex + j, c] = resized_eyelash[i, j, c]

    # 返回添加了左眼睫毛效果的图像
    return image


# 测试接口调用
if __name__ == "__main__":
    input_image_path = "Images/ManWoman.jpeg"
    eyelash_image_path = "Images/eyelash.png"

    try:
        output_img = apply_eyelash_left_eye(input_image_path, eyelash_image_path, vertical_offset=-0.1)
        cv2.imshow("Eyelash Effect", output_img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        print("Eyelash applied successfully.")
    except ValueError as ve:
        print(f"Error: {ve}")

四、注意事项

  1. 确保人脸和眼睛检测器的准确性和鲁棒性,以提高检测效果。
  2. 在调整睫毛位置时,确保不会超出图像边界。
  3. 调整睫毛图像的大小以匹配眼睛的大小,确保睫毛效果自然。
  4. 在合成睫毛图像到原始图像时,考虑到睫毛图像可能具有 alpha 通道,需要正确处理透明度。
  5. 考虑睫毛效果的竖直方向调节参数,以便用户根据具体情况进行调整。
04-22 16:17