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、编写代码
2、运行效果
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}")
四、注意事项
- 确保人脸和眼睛检测器的准确性和鲁棒性,以提高检测效果。
- 在调整睫毛位置时,确保不会超出图像边界。
- 调整睫毛图像的大小以匹配眼睛的大小,确保睫毛效果自然。
- 在合成睫毛图像到原始图像时,考虑到睫毛图像可能具有 alpha 通道,需要正确处理透明度。
- 考虑睫毛效果的竖直方向调节参数,以便用户根据具体情况进行调整。