计算机视觉(opencv)——基于 dlib 的实时摄像头人脸检测 - 教程

news/2025/10/13 16:54:53/文章来源:https://www.cnblogs.com/wzzkaifa/p/19138866


基于 dlib 的实时摄像头人脸检测

在计算机视觉任务中,人脸检测是许多应用的第一步,例如人脸识别、情绪分析、视频会议中的人脸跟踪等。本文将介绍如何使用 dlib 库,通过摄像头实时捕获画面并检测人脸位置,最终实现人脸实时框选显示。


1. dlib 简介

dlib 是一个 C++ 开发的开源机器学习与图像处理库,提供了众多计算机视觉功能,例如:

  • 人脸检测(HOG + 线性分类器 / CNN)

  • 人脸关键点定位(68 点、5 点模型)

  • 人脸对齐与识别

  • 机器学习算法(SVM、KNN、聚类等)

本文使用 dlib 的 HOG (Histogram of Oriented Gradients) + 线性分类器 人脸检测器,速度快且对普通电脑 CPU 友好。


2. 实现目标

我们将完成以下任务:

  1. 打开电脑摄像头实时捕获画面。

  2. 对每一帧图像运行 dlib 的人脸检测器。

  3. 在检测到的人脸位置绘制绿色矩形框。

  4. 按下 Esc 键退出 程序。


3. 核心代码实现

下面是完整的 Python 代码:

import cv2
import dlib
# 1. 打开摄像头
cap = cv2.VideoCapture(0)  # 0表示默认摄像头
# 2. 获取dlib自带的人脸检测器(HOG)
detector = dlib.get_frontal_face_detector()
# 3. 循环读取摄像头帧
while True:ret, img = cap.read()  # 捕获一帧if ret is None:break  # 没有捕获到帧,退出# 可以转为灰度图,提高速度(可选)# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 4. 检测人脸,1表示上采样次数,提升对小人脸的检测率faces = detector(img, 1)# 5. 遍历检测到的人脸框for face in faces:x1 = face.left()y1 = face.top()x2 = face.right()y2 = face.bottom()# 绘制绿色人脸框cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)# 6. 显示当前帧cv2.imshow("face", img)# 7. 按下Esc键退出key = cv2.waitKey(1)if key == 27:break
# 8. 释放摄像头资源
cap.release()
cv2.destroyAllWindows()

4. 关键步骤解析

4.1 摄像头初始化

cap = cv2.VideoCapture(0)
  • 0 表示默认摄像头,可以改成 1 或视频文件路径来切换其他视频源。

4.2 人脸检测器

detector = dlib.get_frontal_face_detector()
  • 这是 dlib 的默认检测器,基于 HOG 特征 + 线性分类器

  • 不需要额外模型文件即可使用。

4.3 人脸检测

faces = detector(img, 1)
  • img:输入图像

  • 1:图像上采样次数,值越大检测到的小人脸越多,但速度更慢。

4.4 绘制人脸框

cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
  • 用绿色框把人脸区域圈出来,直观展示检测结果。

4.5 按键退出

if key == 27:  # Esc键的ASCII码是27break
  • 按下 Esc 键即可退出程序,方便实时演示时手动结束。


5. 运行效果

运行后,你会看到一个实时视频窗口,当摄像头捕捉到人脸时,会自动在脸部绘制绿色矩形框。


6. 常见优化建议

  1. 灰度处理提高效率
    对输入帧先转为灰度,可以减少计算量,加快检测速度:

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector(gray, 1)
  2. 降低分辨率
    如果摄像头分辨率很高,可以先缩小帧:

    img = cv2.resize(img, (640, 480))
  3. 控制上采样次数

    • detector(img, 0):检测速度快,但可能漏检小人脸。

    • detector(img, 1):检测更全面,但速度稍慢。


7. 与 Haar 级联对比

特性dlib HOG 检测器OpenCV Haar 分类器
检测精度高,误检少容易误检,尤其光照复杂时
小人脸检测支持上采样检测容易漏检
运行速度快 (CPU 友好)
使用方便直接调用,无需额外文件需要加载XML分类器文件

结论:dlib 更适合对检测精度有要求的实时任务。


8. 进阶拓展

如果你需要更高的检测准确率,dlib 还提供了 CNN 人脸检测器

cnn_detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")
faces = cnn_detector(img, 1)
  • CNN 检测器精度更高、抗光照能力更强,但计算量大,建议在有 GPU 的环境下使用。


9. 应用场景

  • 实时人脸识别系统

  • 视频会议人脸跟踪

  • 智能门禁与考勤系统

  • 表情识别、情绪分析


10. 总结

通过本文,你学会了:
✅ 使用 dlib 调用摄像头实时捕获画面
✅ 用 get_frontal_face_detector() 检测人脸
✅ 在图像中绘制人脸框并实时显示
✅ 设置 Esc 键作为退出条件

dlib 的 HOG 检测器适合大多数 CPU 实时检测场景,是学习人脸检测的理想选择。如果追求更高精度,可以尝试 CNN 检测器或结合人脸关键点检测实现更精准的人脸定位。

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

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

相关文章

【开题答辩全过程】以 springboot+美食电子商城的设计与实现为例,含有答辩的问题和答案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

程序设计实践训练(Day1) - --YZ-

程序设计实践训练(Day1)Posted on 2025-10-13 16:46 --YZ-- 阅读(0) 评论(0) 收藏 举报程序设计实践训练(Day1) 第一——判断 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+…

vmware部署win7,win2008,win2012等系统如何手动安装vmware tools

vmware部署win7,win2008,win2012等系统如何手动安装vmware toolswin10和win11都能自动安装vmware tools,但win7,win2008和win2012必须手动安装,Windows版的vmware toos镜像名称是windows.iso,路径在VMware Works…

2025 年工业 X 光机厂家最新推荐排行榜:聚焦技术领先与市场认可的优质国内企业选购指南X光检查机/食品X光机/异物检测厂家推荐

引言当前工业制造向高端化、智能化加速转型,X 光机作为核心检测设备,在集成电路、新能源电池、汽车制造等领域的作用愈发关键,是保障产品质量安全的 “工业医生”。但随着市场需求激增,X 光机品牌数量大幅增加,产…

【黑马python】基础 4.Python 循环语句 while for range

笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 循环语句代码示例参考链接黑马-4.Python 循环语句 01-while循环的基础应用tbd

ERP不只是财务软件!如何让生产、采购、仓库都用起来?

很多企业上ERP的时候,都是满心期待的。领导层觉得,有了ERP,信息化终于能覆盖全公司,财务、生产、采购、仓库、销售都能打通,数据实时共享,效率大大提升。 可是一年两年过去了,现实情况却常常是这样:财务天天在…

2025 年国内智能炒菜机器人厂家最新推荐排行榜:聚焦餐饮降本增效需求,精选行业优质品牌云端/大师/节能/健康炒菜机器人厂家推荐

当前餐饮行业深陷人力成本高、菜品标准化难、出餐效率低的困境,智慧厨房升级成为破局关键,炒菜机器人市场需求激增。但市面上品牌繁杂,产品质量、功能优势差异大,餐饮企业难辨优劣,选购时易踩坑。为帮助餐饮企业精…

linux 系统指标 简单监控 脚本

#!/bin/bash # 系统监控脚本 - 每日执行版 # 通过crontab每天00:01触发,执行到23:59:59结束 # 使用方法:添加到crontab - 01 00 * * * /root/sys_monitor.sh# 定义日志目录和文件 LOG_DIR="/root/logs/sys_moni…

2025 年最新推荐!国内优质流量计厂家综合实力推荐榜,助力企业精准选购可靠流量测量设备涡街/超声波/液体/气体/工业流量计厂家推荐

引言在工业生产自动化进程中,流量计作为关键的流体流量测量设备,其性能稳定性、数据精准度直接关系到企业生产效率提升、运营成本控制乃至安全生产保障。当前国内流量计市场品牌繁杂,既有深耕行业多年的老牌企业,也…

宝塔项目配置CDN

核心思路 配置CDN的核心流程可以简单概括为:​​源站(你的服务器)不变 -> 域名解析指向CDN提供商 -> CDN回源到你的服务器​​ 第一步:准备工作​​一个可正常访问的网站​​:确保你的网站在宝塔面板上已经…

59. 螺旋矩阵 II 模拟过程

59. 螺旋矩阵 II 思路 用代码模拟出顺时针填充数字的过程。 每填充一圈涉及4条边:顶部、右列、底部、左列。对每条边的处理保持一致,每条边均采用左闭右开统一处理,避免出现混乱,即循环不变量原则。 不变量:坚持相…

2025 年漆包线制造厂最新推荐排行榜:极细合金 / 自粘铜包铝 / 医疗消融合金等多类型线材企业精选,助力采购商精准挑选优质品牌

引言 当前漆包线行业产能过剩问题突出,供需失衡加剧市场 “内卷”,漆包圆线领域企业扎堆、产品同质化严重,企业常以延长账期、降低加工费等方式竞争,导致行业陷入低水平循环。采购商在众多品牌中难辨优劣,亟需一份…

你真的会在SQL Plus中设置行宽吗?

你真的会在SQL Plus中设置行宽吗?2025-10-13 16:38 潇湘隐者 阅读(0) 评论(0) 收藏 举报在使用SQL Plus命令行时,经常会要设置行宽(linesize),展示的格式才能美观一些.但是你真的对行宽设置都理解透彻了吗? SET …

秒杀系统的架构(Golang 实现) - Lafite

秒杀系统的架构(Golang 实现) 12306抢票,极限并发带来的思考? 每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家…

2025 年 NMN 怎么选?Japan KSKN,抗衰领域的实力之选

随着人们生活水平的提高,对健康和抗衰老的关注度日益提升。NMN 作为一种热门的抗衰成分,逐渐走进大众视野。在众多 NMN 品牌中,Japan KSKN(日本康诺)以其独特的优势脱颖而出。一、Japan KSKN 核心实力,公司概况与…

2025 CSP-S 邮寄

(-?,9.20) 初赛准备。 每天晚上都来机房,做了几套初赛题都差不多 \(60\) 到 \(70\)。 今年 sd 居然可以同时报 -S 和 -J 了( wabc30 兴致勃勃地表示一定要打这最后一次 -J。) [9.20,9.20] 初赛,照例跟 StarsIntoSea…

AlmaLinux安装Gnome界面

没界面的alma Linux 中 执行这个指令sudo systemctl set-default graphical.target执行完后(时间比较长)安装完 GNOME 后,你需要启用图形界面服务。首先,关闭当前的图形界面会话(如果你已经登录的话)。然后,运行…

实用指南:STM32 单片机开发 - FreeRTOS 实时操作系统

实用指南:STM32 单片机开发 - FreeRTOS 实时操作系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

CF1442C Graph Transpositions 比正确答案大了1

做到最后,应该都知道把19步转置以上的分层图压缩掉 我偷懒,把所有信息都压缩在dis[19][x]里面,于是这样会在找最短路的过程中把步数信息覆盖,于是答案会大1 解决方案: 把步数分成奇数步和偶数步就可以保证上一步的…

setState 第二个参数的作用?

在 React(类组件中)setState 的第二个参数是一个 回调函数(callback),它会在 状态更新并且组件重新渲染完成后 执行。 基本语法 this.setState(updater[, callback])updater:可以是对象(直接更新状态)或函数(…