用Python与OpenCV的实践:实时面部对称性分析

目录

思路分析

整体代码

效果展示

总结


在当今计算机视觉领域,人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用,还是美学研究,人脸特征的提取和分析都是关键技术之一。在这篇博客中,我们将深入探讨一个有趣的项目:实时面部对称性分析。通过使用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()

效果展示

总结

我们构建了一个实时面部对称性分析系统,利用计算机视觉技术将面部特征的对称性可视化。希望这篇博客能够激发大家对计算机视觉的兴趣,并鼓励更多的探索与实践。如果你对该项目有任何疑问或建议,欢迎在评论区留言讨论!让我们一起在计算机视觉的世界中不断前行。

相关推荐
qq_537562672 分钟前
跨语言调用C++接口
开发语言·c++·算法
wjs202412 分钟前
DOM CDATA
开发语言
Tingjct14 分钟前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
2401_8321319515 分钟前
Python单元测试(unittest)实战指南
jvm·数据库·python
猷咪40 分钟前
C++基础
开发语言·c++
IT·小灰灰41 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧43 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q44 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳044 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾44 分钟前
php 对接deepseek
android·开发语言·php