当前位置: 首页 > news >正文

使用Dlib库实现人脸识别,比opencv更加好用

一、Dlib 库核心功能与代码细节解析

1. 人脸检测基础流程

Dlib 的人脸检测基于HOG 特征 + SVM 分类器,核心通过dlib.get_frontal_face_detector()实现,返回人脸边界框(dlib.rectangle对象),包含left()/top()/right()/bottom()等方法获取坐标。

代码示例(摄像头实时检测)

import dlib
import cv2detector = dlib.get_frontal_face_detector()  # 初始化检测器
cap = cv2.VideoCapture(0)  # 打开摄像头while True:ret, frame = cap.read()# 检测人脸(第二个参数为upsample_num_times,值越大检测越小的人脸)faces = detector(frame, 0)  # 返回人脸列表for face in faces:# 绘制边界框cv2.rectangle(frame, (face.left(), face.top()), (face.right(), face.bottom()), (255, 0, 0), 2)cv2.imshow("Dlib Face Detection", frame)if cv2.waitKey(1) == 27:break
2. 68 点人脸关键点检测

需加载预训练模型shape_predictor_68_face_landmarks.dat,输出 68 个关键点坐标(按面部区域分组):

  • 0-16:下巴轮廓
  • 17-21:左眉;22-26:右眉
  • 27-30:鼻骨;31-35:鼻孔
  • 36-41:右眼;42-47:左眼
  • 48-59:嘴部外轮廓;60-67:嘴部内轮廓

代码示例(关键点提取与绘制)

import dlib
import cv2
import numpy as npdetector = dlib.get_frontal_face_detector()
# 加载关键点模型(需提前下载)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")img = cv2.imread("face.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector(gray)for face in faces:# 获取关键点(shape.parts()返回68个点对象)shape = predictor(gray, face)# 转换为Numpy数组便于处理landmarks = np.array([[p.x, p.y] for p in shape.parts()])# 绘制关键点for (x, y) in landmarks:cv2.circle(img, (x, y), 2, (0, 255, 0), -1)cv2.imshow("Landmarks", img)
3. 基于关键点的应用扩展
(1)疲劳检测(疲劳检测.py核心解析)

通过计算眼睛纵横比(EAR) 判断闭眼状态:

  • EAR = (垂直距离均值) / 水平距离
  • 阈值<0.3视为闭眼,连续 50 帧闭眼触发警报
def eye_aspect_ratio(eye):# 垂直方向关键点距离(1-5、2-4)A = euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2))B = euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2))# 水平方向关键点距离(0-3)C = euclidean_distances(eye[0].reshape(1, 2), eye[3].reshape(1, 2))return ((A + B) / 2.0) / C  # 计算EAR# 提取左右眼关键点
rightEye = shape[36:42]  # 右眼:36-41号点
leftEye = shape[42:48]   # 左眼:42-47号点
ear = (eye_aspect_ratio(leftEye) + eye_aspect_ratio(rightEye)) / 2.0
(2)表情识别(表情识别.py核心解析)

通过嘴部关键点计算两个指标:

  • MAR(嘴宽高比):嘴部垂直距离均值 / 水平距离(判断张嘴幅度)
  • MJR(嘴宽 / 脸颊宽比):嘴部宽度 / 脸颊宽度(判断微笑程度)
def MAR(shape):# 嘴部垂直距离(50-58、51-57、52-56)A = euclidean_distances(shape[50].reshape(1,2), shape[58].reshape(1,2))B = euclidean_distances(shape[51].reshape(1,2), shape[57].reshape(1,2))C = euclidean_distances(shape[52].reshape(1,2), shape[56].reshape(1,2))# 嘴部水平距离(48-54)D = euclidean_distances(shape[48].reshape(1,2), shape[54].reshape(1,2))return ((A+B+C)/3)/D  # 平均垂直距离/水平距离def MJR(shape):M = euclidean_distances(shape[48].reshape(1,2), shape[54].reshape(1,2))  # 嘴宽J = euclidean_distances(shape[3].reshape(1,2), shape[13].reshape(1,2))   # 脸颊宽(3-13号点)return M/J

二、Dlib 与 OpenCV 的深度对比

技术细节DlibOpenCV
人脸检测原理HOG+SVM(精度高,对模糊图像鲁棒性强)Haar 级联(速度快但易受光照影响)、DNN(精度接近 Dlib)
关键点支持内置 68 点 / 5 点预训练模型,调用简单无原生关键点模型,需手动实现或集成其他库
实时性单帧处理约 30ms(取决于 CPU,适合近景)Haar 级联单帧处理约 10ms(适合远景实时检测)
扩展性提供机器学习工具(如 SVM、决策树)侧重图像处理(滤波、变换、特征提取)

代码对比(摄像头人脸检测)

# OpenCV Haar级联检测
opencv_faces = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = opencv_faces.detectMultiScale(gray, 1.1, 4)  # 返回(x,y,w,h)# Dlib检测
detector = dlib.get_frontal_face_detector()
faces = detector(gray)  # 返回dlib.rectangle对象

三、实际代码应用场景详解

1. 实时关键点可视化(关键点检测.py
  • 功能:从摄像头实时采集图像,检测人脸并标注 68 个关键点编号。
  • 关键代码
    # 循环处理每一帧
    while True:ret, frame = cap.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = detector(gray)for face in faces:shape = predictor(gray, face)landmarks = np.matrix([[p.x, p.y] for p in shape.parts()])for idx, point in enumerate(landmarks):pos = (point[0,0], point[0,1])cv2.circle(frame, pos, 2, (0,255,0), -1)  # 绘制点cv2.putText(frame, str(idx), pos, ...)  # 标注编号cv2.imshow("Landmarks", frame)
    
2. 面部特征轮廓绘制(轮毂绘制.py
  • 功能:通过drawLine(连线)和drawConvexHull(凸包)绘制面部轮廓。
  • 核心函数
    def drawConvexHull(image, shape, start, end):# 提取指定范围关键点(如36-41为右眼)facial_points = shape[start:end+1]hull = cv2.convexHull(facial_points)  # 计算凸包cv2.drawContours(image, [hull], -1, (0,255,0), 2)  # 绘制轮廓
    
3. 年龄性别预测(年龄性别预测.py
  • 技术栈:OpenCV 的 DNN 模块(而非 Dlib),加载 Caffe 预训练模型。
  • 流程
    1. faceNet检测人脸边界框
    2. 截取人脸区域,转换为模型输入格式(blobFromImage
    3. 分别输入genderNetageNet预测结果
    # 性别预测
    genderNet.setInput(blob)
    gender = genderList[genderNet.forward()[0].argmax()]
    # 年龄预测
    ageNet.setInput(blob)
    age = ageList[ageNet.forward()[0].argmax()]
    

四、总结

  • Dlib 优势:在人脸关键点检测和精细化特征分析(如表情、疲劳)中表现优异,适合需要高精度面部特征的场景。
  • OpenCV 优势:全能型视觉工具,擅长图像处理、摄像头交互和快速目标检测,常作为 Dlib 的辅助工具(如图像读写、显示)。
  • 组合用法:实际项目中常结合两者 —— 用 Dlib 提取关键点,用 OpenCV 进行图像预处理(如灰度转换)和结果可视化。
http://www.dtcms.com/a/414617.html

相关文章:

  • Java RSA非对称加密与数字签名的安全数据传输
  • 【视觉SLAM十四讲】视觉里程计 1
  • Gnirehtet 教程:USB 数据线 电脑网络 反共享 Android设备
  • STM32启动流程解析:从BootROM到BootLoader
  • 网站文件目录wordpress find
  • 【Android之路】界面和状态交互
  • xget下载加速
  • 丝绸之路网站建设策划书如何用vc做网站
  • 【leetcode】35. 搜索插入位置
  • C++ —— 无锁队列
  • 具身智能:从理论到实践的深度探索与应用实践
  • 【算法】相交链表
  • Unity FairyGUI笔记
  • 【qml-11】Quick3D实现机器人欧拉旋转、拖动视角
  • 垂直网站建设步骤在线海报设计网站
  • PHP 8.2 vs PHP 8.3 对比:新功能、性能提升和迁移技巧
  • 做的好的阅读类的网站有哪些外贸seo软件
  • 安装MariaDB服务器流程介绍在Ubuntu 22.04系统
  • Windows环境下PDF批量打印的轻量级实现方案
  • 花箱 东莞网站建设9420高清完整版视频在线观看1
  • 响应式设计 手机网站html5 网站源码
  • 下载| Windows 11 ARM版9月官方ISO系统映像 (适合部分笔记本、苹果M系列芯片电脑、树莓派和部分安卓手机平板)
  • 2018年企业网站优化如何做网站 内容优化
  • windows系统电脑远程登录ubuntu系统电脑
  • 【算法】——分治思想与快速排序的实践应用
  • JavaScript ES5 vs ES6 核心特性对比
  • three.js
  • PyQt和Qt、PyQt和PySide的关系
  • 网站开发工具与技术企业网站空间在哪里
  • 网站开发一个页面多少钱天堂网