Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

devtools/2024/10/11 9:19:07/

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

一、简单介绍

二、简单人脸检测添加戴眼镜效果实现原理

三、简单人脸检测添加戴眼镜效果案例实现简单步骤

四、注意事项


一、简单介绍

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

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

人脸检测的两个重要概念:哈尔特征分类器(Haar Feature Classifier)和级联分类器(Cascade Classifier)是用于。

哈尔特征分类器:

    定义:哈尔特征分类器是一种基于哈尔特征的机器学习算法,用于检测图像中的对象或特定区域。

    原理:哈尔特征是一种基于图像局部特征的数学描述方法,通过对图像中不同区域像素值的差异进行计算,提取出具有区分度的特征。这些特征可以是边缘、线段、角点等。哈尔特征分类器通过训练过程学习到一组有效的特征模式,用于区分目标和非目标区域。

    应用:哈尔特征分类器常用于对象检测任务,如人脸检测、眼睛检测等。在训练过程中,通常需要提供正样本(包含目标的图像)和负样本(不包含目标的图像),让分类器学习区分目标和非目标的特征模式。

级联分类器:

    定义:级联分类器是一种多级联组成的分类器结构,由多个弱分类器组成,通过级联方式实现目标检测。

    原理:级联分类器将多个简单的分类器组合成一个复杂的分类器,每个简单分类器都是一个弱分类器,对目标区域进行初步筛选或过滤。级联分类器通过级联多个弱分类器,每个分类器都负责判断一组特征是否满足条件,通过级联的方式实现高效的目标检测。

    应用:级联分类器常用于实时目标检测任务,如人脸检测、车辆检测等。OpenCV 中的 Haar 级联分类器是基于哈尔特征的级联分类器,通过级联多个分类阶段来实现高效的人脸检测。级联分类器的优势在于其高速、高效的检测性能,适用于实时应用场景。

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

python"> ...\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. 使用 OpenCV 的人脸识别功能检测图像中的人脸位置。
  2. 在检测到的每张人脸位置上,根据人脸的宽度调整眼镜的大小。
  3. 将调整后的眼镜图像覆盖到人脸图像上,完成眼镜效果的添加。

具体方法:

  1. 使用 OpenCV 加载人脸识别分类器。
  2. 读取人脸图像和眼镜图像。
  3. 对人脸图像进行人脸检测,获取人脸的位置信息。
  4. 遍历检测到的每张人脸,根据人脸宽度调整眼镜大小。
  5. 将调整后的眼镜图像覆盖到对应人脸位置上。
  6. 返回带有眼镜效果的图像数据。

案例中涉及的两个关键函数说明

  1. over_img(img, img_over, over_x, over_y)

    • 功能:将一个图像覆盖在另一个图像的指定位置上。
    • 参数:
      • img:原始图像,numpy 数组格式。
      • img_over:要覆盖的图像,numpy 数组格式。
      • over_x:要覆盖图像的左上角 x 坐标。
      • over_y:要覆盖图像的左上角 y 坐标。
    • 返回值:覆盖后的图像,numpy 数组格式。
  2. apply_glasses(input_image_path, glasses_image_path, vertical_offset=0.35)

    • 功能:在输入的人脸图像上添加眼镜效果。
    • 参数:
      • input_image_path:输入的人脸图像路径。
      • glasses_image_path眼镜图像的路径。
      • vertical_offset眼镜垂直位置的调整参数,默认值为0.35。
    • 返回值:带眼镜效果的图像数据,numpy 数组格式。
  3. cv2.CascadeClassifier()

    • 函数说明:用于加载 Haar 级联分类器,用于人脸检测
    • 参数:
      • xml_file_path:Haar 级联分类器的 XML 文件路径。
    • 返回值:返回一个级联分类器对象,用于后续的人脸检测

这些函数负责在人脸图像上添加眼镜效果,其中over_img函数用于将眼镜图像覆盖到人脸图像的指定位置上,而apply_glasses函数则是整个眼镜效果添加的入口函数,调用了人脸识别、图像处理等功能。

三、简单人脸检测添加戴眼镜效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

python">"""
简单人脸检测添加戴眼镜效果1、使用 OpenCV 加载人脸识别分类器。2、读取人脸图像和眼镜图像。3、对人脸图像进行人脸检测,获取人脸的位置信息。4、遍历检测到的每张人脸,根据人脸宽度调整眼镜大小。5、将调整后的眼镜图像覆盖到对应人脸位置上。6、返回带有眼镜效果的图像数据。
"""import cv2def over_img(img, img_over, over_x, over_y):"""将一张图像覆盖到另一张图像上:param img: (numpy.ndarray) 目标图像数据:param img_over: (numpy.ndarray) 待覆盖图像数据,包含 alpha 通道:param over_x: (int) 待覆盖图像左上角的 x 坐标:param over_y: (int) 待覆盖图像左上角的 y 坐标:return: numpy.ndarray 覆盖后的图像数据"""img_h, img_w, c = img.shapeimg_over_h, img_over_w, over_c = img_over.shape# 将待覆盖图像转换为带 alpha 通道的 BGRA 格式if over_c == 3:img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)# 遍历待覆盖图像的每个像素for w in range(0, img_over_w):for h in range(0, img_over_h):# 透明像素不能覆盖目标图像if img_over[h, w, 3] != 0:# 遍历 RGB 通道for c in range(0, 3):x = over_x + wy = over_y + h# 如果超出目标图像范围,则跳出循环if x >= img_w or y >= img_h:break# 将待覆盖图像像素覆盖到目标图像上img[y, x, c] = img_over[h, w, c]return imgdef apply_glasses(input_image_path, glasses_image_path, vertical_offset=0.35):"""在人脸图像上添加眼镜效果:param input_image_path: (str) 输入的人脸图像路径:param glasses_image_path: (str) 眼镜图像的路径:param vertical_offset: (float) 眼镜垂直位置的调整参数,范围为0到1,默认值为0.35:return: numpy.ndarray 带眼镜效果的图像数据"""# 参数安全性校验if not isinstance(input_image_path, str) or not input_image_path.strip():raise ValueError("Invalid input image path.")if not isinstance(glasses_image_path, str) or not glasses_image_path.strip():raise ValueError("Invalid glasses image path.")if not (0 <= vertical_offset <= 1):raise ValueError("Vertical offset parameter must be between 0 and 1.")# 读取人脸和眼镜图像img = cv2.imread(input_image_path)glass = cv2.imread(glasses_image_path, cv2.IMREAD_UNCHANGED)  # 保留图像类型height, weight, channel = glass.shape# 加载人脸识别联结器faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")# 进行人脸检测faces = faceCascade.detectMultiScale(img, 1.15, 4)# 对每个检测到的人脸应用眼镜效果for (x, y, w, h) in faces:gw = wgh = int(height * gw / weight)# 调整眼镜图像大小以适应人脸宽度img_over_new = cv2.resize(glass, (gw, gh))# 将眼镜图像覆盖到人脸图像上img = over_img(img, img_over_new, x, y + int(h * vertical_offset))# 绘制脸部范围图框# cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)return img# 测试接口调用
if __name__ == "__main__":input_image_path = "Images/TwoManFace.png"glasses_image_path = "Images/glasses.png"try:output_img = apply_glasses(input_image_path, glasses_image_path, vertical_offset=0.0)cv2.imshow("output_img", output_img)cv2.waitKey(0)cv2.destroyAllWindows()print("Glasses applied successfully.")except ValueError as ve:print(f"Error: {ve}")

四、注意事项

  1. 人脸识别结果可能有误,因此需要根据实际情况调整眼镜的位置和大小。
  2. 眼镜图像的背景应该是透明的,以便与人脸图像进行叠加。
  3. 调整眼镜大小时,应保持眼镜的比例,以确保效果自然。
  4. 确保输入图像路径和眼镜图像路径有效,以避免出现读取失败的情况。
  5. 在覆盖眼镜图像到人脸图像时,注意边界情况,防止超出图像范围。
  6. 眼镜的垂直位置调整参数应在0到1之间,表示眼镜在人脸垂直方向上的偏移量。

http://www.ppmy.cn/devtools/6618.html

相关文章

使用FFmpeg从音视频处理到流媒体技术的探索和实战应用

在多媒体领域&#xff0c;FFmpeg无疑是一款不可或缺的强大工具。它不仅拥有广泛的应用场景&#xff0c;涵盖了音视频转码、剪辑、封装解封装、抓取以及流化等众多功能&#xff0c;而且其开源特性更是吸引了无数开发者投入到多媒体处理的创新浪潮中。本文将详细解读FFmpeg的功能…

科目一笔记

扣分 目前只有 12 9 6 3 1分。 扣1分的 会车 不按照规定会车&#xff0c; 普倒掉&#xff08;普通路上不按规定掉头&#xff0c;倒车&#xff09; ​ 高速、城市快速路…以外的道路 普通路 ​ 校车…以外的道车 普通车 使用灯光 ​ 需要注意的是只有不按规定使用灯光&…

synchronized和lock的区别

synchronized 和 Lock 都是Java中用于实现线程同步的手段&#xff0c;它们有以下主要区别&#xff1a; synchronized&#xff08;同步关键字&#xff09; 内置锁&#xff1a;synchronized 是Java的一个关键字&#xff0c;它是一个内置锁&#xff0c;由JVM自动管理。使用方便&…

Java垃圾回收1

1.对象什么时候可以被垃圾器回收 1.垃圾回收的概念 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c; 在Java语言中&#xff0c;有了自动的垃圾回收机制&#xff0c;也就是我们熟悉的GC(Garbage Collection)。 有了垃圾…

STM32H750外设ADC之双重 ADC 模式

目录 概述 1 双重 ADC 模式介绍 1.1 双重 ADC模式 1.2 双重 ADC 模式的类型 2 双重 ADC 模式寄存器的配置 3 模式功能实现 3.1 注入同步模式 3.2 支持独立注入的常规同步模式 3.2.1 中断的方式 3.2.2 DMA 读取常规数据 3.3 支持独立注入的交替模式 3.3.1 中断触发…

【Linux的git操作】

Linux学习笔记---010 Linux的git操作1、什么是gitee2、git 准备工作2.1、查看是否安装了 git 版本工具2.2、安装 git 工具/更新成最新版本2.3、在gitee上创建远程仓库&#xff08;略&#xff09;2.4、提交file的初始化操作 3、git的“三板斧”3.1、add3.2、commit3.3、push3.4、…

Ubuntu 22.04.4 LTS 初始配置(root、ssh)

开启root 设置 root 用户的密码。 在终端中输入以下命令并按 Enter 键&#xff1a; sudo passwd root然后&#xff0c;你需要输入你的当前用户密码以获取sudo权限&#xff0c;接着你将被提示输入新的 root 密码。输入你想要设置的密码&#xff0c;然后再次输入以确认。 启用…

Kubernetes(k8s)集群搭建部署,master节点配置

目录 1.切换为root用户 2.关闭防火墙,关闭swap分区和禁用SElinux 3.安装docker 4.更改daemon.json文件,指定 Docker 守护进程使用的 cgroup 驱动程序 5.重启docker服务 6.配置kubernetes.repo 7.安装Kubelet、Kubeadm、Kubectl 8.设置开机自启