目录
在当今计算机视觉领域,人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用,还是美学研究,人脸特征的提取和分析都是关键技术之一。在这篇博客中,我们将深入探讨一个有趣的项目:实时面部对称性分析。通过使用Python语言、OpenCV库和dlib库,实现一个能够实时检测人脸并评估其对称性的程序。
思路分析
-
导入库:
- 使用
cv2
处理图像和视频流,dlib
用于人脸检测和特征点提取,numpy
进行数值计算,PIL
用于绘制中文文本。
- 使用
-
加载模型:
- 使用
dlib
加载人脸检测器和特征点预测器,特征点预测器利用68个关键点来定位人脸特征。
- 使用
-
定义对称性计算函数:
calculate_symmetry
函数计算左右眼中心与鼻子的距离,进而评估面部的对称性。对称性分数是左右鼻子距离的差值,值越小表示越对称。
-
文本绘制函数:
draw_text
函数将OpenCV图像转换为PIL图像,利用PIL绘制中文文本,避免OpenCV不支持中文的问题。
-
摄像头初始化:
- 使用
cv2.VideoCapture(0)
打开默认摄像头。
- 使用
-
实时视频处理循环:
- 循环读取摄像头帧,将每帧转换为灰度图像以进行人脸检测。
- 检测到人脸后,提取特征点并计算对称性分数。
- 根据分数分类对称性状态,并在图像上绘制特征点和状态信息。
-
帧率计算:
- 计算每帧处理的时间,以便显示实时帧率。
-
显示结果:
- 使用
cv2.imshow
显示处理后的图像,用户可以通过按下"q"键退出。
- 使用
-
释放资源:
- 结束时释放摄像头和关闭所有窗口。
整体代码
python
import cv2
import dlib
import numpy as np
import time
from PIL import Image, ImageDraw, ImageFont
# 加载人脸检测器和特征点预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("./model/shape_predictor_68_face_landmarks.dat")
def calculate_symmetry(landmarks):
left_eye = landmarks[36:42]
right_eye = landmarks[42:48]
nose = landmarks[30]
left_eye_center = np.mean(left_eye, axis=0)
right_eye_center = np.mean(right_eye, axis=0)
left_nose_distance = np.linalg.norm(left_eye_center - nose)
right_nose_distance = np.linalg.norm(right_eye_center - nose)
symmetry_score = abs(left_nose_distance - right_nose_distance)
return symmetry_score
def draw_text(image, text, position, font_size=30):
# 将OpenCV图像转换为PIL图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(pil_image)
font = ImageFont.truetype("simhei.ttf", font_size) # 使用黑体字体
draw.text(position, text, font=font, fill=(255, 255, 255, 0))
return cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
# 初始化摄像头
cap = cv2.VideoCapture(0)
while True:
start_time = time.time() # 记录开始时间
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = detector(gray)
for face in faces:
landmarks = predictor(gray, face)
landmarks = np.array([[p.x, p.y] for p in landmarks.parts()])
# 计算对称性
symmetry_score = calculate_symmetry(landmarks)
# 对称性分类
if symmetry_score < 5:
symmetry_status = "完全对称"
elif symmetry_score < 10:
symmetry_status = "较为对称"
elif symmetry_score < 15:
symmetry_status = "不太对称"
else:
symmetry_status = "高度不对称"
# 可视化特征点
for (x, y) in landmarks:
cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)
# 在图像上显示对称性分数和状态
frame = draw_text(frame, f'对称性分数: {symmetry_score:.2f}', (10, 30))
frame = draw_text(frame, f'状态: {symmetry_status}', (10, 60))
# 计算并显示FPS
fps = 1 / (time.time() - start_time)
frame = draw_text(frame, f'帧率: {fps:.2f}', (10, 90))
# 显示图像
cv2.imshow("haha", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头和窗口
cap.release()
cv2.destroyAllWindows()
效果展示
总结
我们构建了一个实时面部对称性分析系统,利用计算机视觉技术将面部特征的对称性可视化。希望这篇博客能够激发大家对计算机视觉的兴趣,并鼓励更多的探索与实践。如果你对该项目有任何疑问或建议,欢迎在评论区留言讨论!让我们一起在计算机视觉的世界中不断前行。