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

news2024/9/25 16:53:28

目录

思路分析

整体代码

效果展示

总结


        在当今计算机视觉领域,人脸识别和分析技术得到了广泛应用。无论是安全验证、社交媒体应用,还是美学研究,人脸特征的提取和分析都是关键技术之一。在这篇博客中,我们将深入探讨一个有趣的项目:实时面部对称性分析。通过使用Python语言、OpenCV库和dlib库,实现一个能够实时检测人脸并评估其对称性的程序。

思路分析

  • 导入库

    • 使用cv2处理图像和视频流,dlib用于人脸检测和特征点提取,numpy进行数值计算,PIL用于绘制中文文本。
  • 加载模型

    • 使用dlib加载人脸检测器和特征点预测器,特征点预测器利用68个关键点来定位人脸特征。
  • 定义对称性计算函数

    • calculate_symmetry函数计算左右眼中心与鼻子的距离,进而评估面部的对称性。对称性分数是左右鼻子距离的差值,值越小表示越对称。
  • 文本绘制函数

    • draw_text函数将OpenCV图像转换为PIL图像,利用PIL绘制中文文本,避免OpenCV不支持中文的问题。
  • 摄像头初始化

    • 使用cv2.VideoCapture(0)打开默认摄像头。
  • 实时视频处理循环

    • 循环读取摄像头帧,将每帧转换为灰度图像以进行人脸检测。
    • 检测到人脸后,提取特征点并计算对称性分数。
    • 根据分数分类对称性状态,并在图像上绘制特征点和状态信息。
  • 帧率计算

    • 计算每帧处理的时间,以便显示实时帧率。
  • 显示结果

    • 使用cv2.imshow显示处理后的图像,用户可以通过按下“q”键退出。
  • 释放资源

    • 结束时释放摄像头和关闭所有窗口。

整体代码

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()

效果展示

 

 

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arco HomeMenu - 无入侵式的个性化菜单配置插件

关于 Arco HomeMenu Arco HomeMenu 插件是一款对 odoo 菜单功能的增强工具&#xff0c;它的主要功能是允许用户个性化菜单收藏。主要通过分类文件夹及布局功能实现。 Arco HomeMenu 插件主要用于优化用户在 odoo 系统中的操作体验。通过插件功能&#xff0c;用户可以根据自己的…

innovus:如何报告SI

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 报告SI首先要设置si aware,报

79、Python之鸭子类型:没有听过鸭子类型?关键在于认知的转变

引言 不同于Java等静态类型的语言&#xff0c;Python基于动态类型系统的设计理念&#xff0c;使得Python在很多应用场景中&#xff0c;显得更急灵活、高效。而在动态类型系统中&#xff0c;有一个很重要的概念&#xff0c;就是“鸭子类型”。鸭子类型的背后&#xff0c;代表的…

一地通过率高达46.43%!为什么都说软考难?

从2023年上半年到2024年上半年&#xff0c;近三次考试&#xff0c;几个考区的软考通过率基本不超过13%。 然而根据近日陕西省科技资源统筹中心公布的数据&#xff0c;从1987年到2024年&#xff0c;陕西软考的总拿证率竟然高达46.43%。软考真的有大家认为的那么难吗&#xff1f;…

Unity场景内画车道线(根据五阶曲线系数)

之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位&#xff0c;根据点位来进行构建。 由于AI识别出来的点位不线性&#xff0c;画出来的车道线经常是歪七扭八&#xff0c;所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建&#xff0c;公式…

DATEDIF 函数用不了?DATEDIF函数怎么用我来告诉你

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4c5; 在处理与时间相关的数据时&#xff0c;DATEDIF函数是Excel中一个非常有用的工具。DATEDIF函数可以计算两个日期之间的差异&#xff0c;无论是天数、月数还是年数。这在处理年龄计算、工龄统计或任何需要日期差…

大健康管理系统|健康综合咨询问诊平台设计与实现(源码+数据库+文档)

大健康管理系统目录 目录 健康综合咨询问诊平台设计与实现 一、前言 二、系统功能设计 三、系统实现 5.1用户信息管理 5.2 医生信息管理 5.3科室信息管理 5.1新闻信息管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文…

docker笔记_数据卷、挂载

docker数据存储 概述数据卷&#xff08;Volumes&#xff09;特点操作 绑定挂载&#xff08;Bind Mounts&#xff09;内存挂载&#xff08;tmpfs&#xff09;总结 概述 镜像构建过程中&#xff0c;所产生的layer都是只读层&#xff0c;只有在创建容器时才会生成一个可写的容器层…

鸿蒙OpenHarmony【小型系统基础内核(虚拟内存管理)】子系统开发

虚拟内存管理 基本概念 虚拟内存管理是计算机系统管理内存的一种技术。每个进程都有连续的虚拟地址空间&#xff0c;虚拟地址空间的大小由CPU的位数决定&#xff0c;32位的硬件平台可以提供的最大的寻址空间为0-4GiB。整个4GiB空间分成两部分&#xff0c;LiteOS-A内核占据3Gi…

Go weak包前瞻:弱指针为内存管理带来新选择

在介绍Go 1.23引入的unique包的《Go unique包&#xff1a;突破字符串局限的通用值Interning技术实现》一文中&#xff0c;我们知道了unique包底层是基于internal/weak包实现的&#xff0c;internal/weak是一个弱指针功能的Go实现。所谓弱指针(Weak Pointer&#xff0c;也称为弱…

算法分享——《滑动窗口》

&#x1f68d;《长度最小的子数组》 &#x1f6b2;题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符…

Linux进程状态与进程优先级

目录 Linux进程状态与进程优先级 前置知识 并行与并发 时间片 进程状态 基本介绍 等待状态的本质 swap分区 Linux进程状态 Linux进程状态分类 运行状态&#xff08;Running&#xff09;与等待状态&#xff08;Sleeping&#xff09; 硬盘等待状态&#xff08;Disk S…

计算机视觉必备模型YOLO系列模型的知识点,提供YOLOv1-v8模型结构与代码实例

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉必备模型YOLO系列模型的知识点&#xff0c;提供YOLOv1-v8模型结构与代码实例。本文全面介绍了计算机视觉领域中必备的YOLO系列模型&#xff0c;详细梳理了YOLOv1至YOLOv8模型的结构及其演变过程。文章内容…

Node.js 学习 path模块、fs模块、npm软件包管理器、导出、导入

目录 1.Node.js入门 1.1 什么是 Node.js 1.2 fs模块-读写文件 1.3 path模块-路径处理 1.4 案例-压缩前端html 1.5 认识URL中的端口号 1.6 http模块-创建Web服务 1.7 案例-浏览时钟 2.Node.js 模块化 2.1 模块化简介 2.1.1 什么是模块化&#xff1f; 2.1.2 CommonJS…

【软件建设方案】设备管理系统建设方案(Doc原件参考)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 3.系统功能设计 3.1.功能清单列表 3.2.设备信息数据库 3.3.设备维护计划管理子系统 3.4.设备维护管理子系统 3.5.备件物资管理子系统 3.6.…

1区IEEE-Trans发文暴涨3倍,CCF-B类,刚跌出了TOP榜!这是不是官方提前发出警告?

【SciencePub学术】今天给大家推荐的是1本地球科学领域的SCI—《IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING》&#xff0c;IEEE-Trans系列&#xff0c;并且是CCF-B类期刊&#xff01;此系列的期刊在业界的权威性还是不容置疑的。 优点VS缺点 ✦ IEEE-Trans系列 ✦ C…

普通本科生也能成为AI高手:人工智能学习指南

在人工智能&#xff08;AI&#xff09;日益普及的今天&#xff0c;许多人都渴望掌握这项技术&#xff0c;但常有人疑惑&#xff1a;没有顶尖学府的背景&#xff0c;我也能学习人工智能吗&#xff1f; 答案是肯定的&#xff01; 人工智能是一个充满机遇与挑战的领域&#xff0c…

渗透测试工具 sqlmap 基础教程

一、引言 在网络安全领域&#xff0c;渗透测试是一项至关重要的工作&#xff0c;它可以帮助我们发现系统中的安全漏洞&#xff0c;从而采取相应的措施进行修复。而 sqlmap 作为一款强大的开源渗透测试工具&#xff0c;专门用于检测和利用 SQL 注入漏洞。本文将为大家详细介绍 …

HTTP 1.0 2.0 3.0详解

HTTP HTTP全称超文本传输协议&#xff0c;是一种属于应用层的通信协议。它允许将超文本标记语言文档&#xff08;HTML&#xff09;从Web服务器传输到客户端的浏览器。 HTTP报文结构 请求报文结构 请求方法&#xff1a; GET&#xff1a;一般用来请求已被URI识别的资源&#x…

Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用

一、Elasticsearch7.7.1集群不能相互发现的问题解决 在使用elasticsearch7.7.1搭建集群&#xff0c;使用了3台服务器作为节点&#xff0c;但在搭建的过程中发现每台服务器的elasticsearch服务都正常&#xff0c;但是不能相互发现&#xff0c;期间进行了一些配置的修改偶尔出现了…