使用 OpenCV 和 dlib 进行人脸检测

文章目录

  • 1. 什么是 dlib
  • 2. 前期准备介绍
    • 2.1 环境准备
    • 2.2 dlib 的人脸检测器
  • 3. 代码实现
    • 3.1 导入库
    • 3.2 加载检测器
    • 3.3 读取并调整图像大小
    • 3.4 检测人脸
    • 3.5 绘制检测框
    • 3.6 显示结果
  • 4. 完整代码
  • 5. 优化与改进
    • 5.1 提高检测率
    • 5.2 处理 BGR 与 RGB 问题
  • 6. 总结

人脸检测是计算机视觉中的基础任务,广泛应用于安防监控、人脸识别、美颜相机等场景。本文将介绍如何结合 OpenCVdlib 库实现高效的人脸检测,并详细解析代码实现。


1. 什么是 dlib

dlib 是一个现代化的 C++ 机器学习工具库,同时也提供 Python 接口。它由 Davis King 开发并维护,广泛应用于计算机视觉、图像处理和机器学习任务。

主要特点

  1. 高性能:优化的 C++ 实现,运行速度快
  2. 跨平台:支持 Windows、Linux、macOS
  3. 丰富的功能:人脸检测、特征点识别、物体检测、深度学习等
  4. 易用的 Python API:与 NumPy、OpenCV 无缝集成
  5. 开源免费:采用 Boost 软件许可,可商用

2. 前期准备介绍

2.1 环境准备

在开始之前,请确保安装以下 Python 库:

pip install opencv-python dlib
  • OpenCV:用于图像读取、处理和显示。
  • dlib:提供高性能的机器学习模型,包括人脸检测和特征点识别。

2.2 dlib 的人脸检测器

dlib 提供了两种主要的人脸检测方法:

  1. HOG(方向梯度直方图)+ SVM(支持向量机)get_frontal_face_detector
    • 适用于 CPU 环境,速度较快,但对小脸或侧脸检测效果一般。
  2. CNN(卷积神经网络)dlib.cnn_face_detection_model_v1
    • 检测精度更高,但计算量较大,适合 GPU 加速。

本文主要介绍 HOG + SVM 方法,因其在速度和精度之间取得了较好的平衡。


3. 代码实现

3.1 导入库

import cv2
import dlib

3.2 加载检测器

detector = dlib.get_frontal_face_detector()  # 使用HOG+SVM检测器

3.3 读取并调整图像大小

img = cv2.imread('hezhao.jpg')  # 读取图像(BGR格式)
img = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)  # 缩小50%,提高检测速度
  • resize 可以缩小图像,加快检测速度(但可能影响小脸检测)。

3.4 检测人脸

faces = detector(img, 0)  # 第二个参数0表示不进行上采样
  • 参数 0 表示不对图像进行上采样(适用于原图或已缩小的图像)。
  • 如果检测不到小脸,可以尝试 faces = detector(img, 1),表示上采样一次。

3.5 绘制检测框

for face in faces:  # 遍历检测到的人脸x1, y1 = face.left(), face.top()  # 左上角坐标x2, y2 = face.right(), face.bottom()  # 右下角坐标cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)  # 画绿色矩形框
  • cv2.rectangle 用于在图像上绘制矩形框,参数:
    • (x1, y1):左上角坐标
    • (x2, y2):右下角坐标
    • (0, 255, 0):绿色(BGR格式)
    • 2:线宽

3.6 显示结果

cv2.imshow("result", img)
cv2.waitKey(0)  # 按任意键关闭窗口
cv2.destroyAllWindows()

显示效果如下:

在这里插入图片描述


4. 完整代码

import cv2
import dlib# 1. 加载检测器
detector = dlib.get_frontal_face_detector()# 2. 读取图像并调整大小
img = cv2.imread('hezhao.jpg')
img = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)  # 缩小50%# 3. 检测人脸
faces = detector(img, 0)  # 0表示不进行上采样# 4. 绘制检测框
for face in faces:x1, y1 = face.left(), face.top()x2, y2 = face.right(), face.bottom()cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)  # 绿色框# 5. 显示结果
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 优化与改进

5.1 提高检测率

  • 上采样(Upsample)
    faces = detector(img, 1)  # 上采样一次,检测更小人脸
    
  • 使用 CNN 模型(更精准但更慢):
    cnn_detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")
    faces = cnn_detector(img, 0)
    

5.2 处理 BGR 与 RGB 问题

OpenCV 默认读取 BGR 格式,而 dlib 的 HOG 检测器需要 RGB 格式,可以转换:

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换为RGB
faces = detector(img_rgb, 0)

6. 总结

  • dlib 的 HOG 检测器 在 CPU 上运行速度快,适合实时检测。
  • OpenCV 负责图像读取、处理和显示,与 dlib 结合使用非常方便。
  • 可以通过 上采样CNN 模型 提高检测精度。

希望这篇教程能帮助你快速上手 OpenCV + dlib 人脸检测!🚀

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

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

相关文章

spring 的PropertySource 类与 @PropertySource 注解详解与对比

PropertySource 类与 PropertySource 注解详解与对比 在这里插入图片描述 一、PropertySource 类详解 1. 类型与作用 类型:接口(org.springframework.core.env.PropertySource)作用:抽象配置数据源,提供统一的键值…

Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections

(以下内容全部来自上述课程) 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色:提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator:比较规则root:红黑树根节点的地址值size:集合的长度和红黑树…

基于Playwright的浏览器自动化MCP服务

一、服务定位与核心功能 github.com/executeautomation/mcp-playwright 是一个基于 Playwright(微软开源的跨浏览器自动化测试框架)的 Model Context Protocol (MCP) 服务,核心功能是将浏览器自动化能力集成到大语言模型(LLM&…

OSPF网络协议

OSPF(Open Shortest Path First)是一种链路状态路由协议,属于IGP(内部网关协议),用于在单一自治系统(AS)内动态分发路由信息。它通过计算最短路径(基于Dijkstra算法&…

Ubuntu 22.04.4操作系统初始化详细配置

上一章节,主要讲解了Ubuntu 22.04.4操作系统的安装,但是在实际生产环境中,需要对Ubuntu操作系统初始化,从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例) 参考: ZERO 3 | Radxa Docs 大部分的Linux开发板等设备都大同小异 如树莓派、香橙派、STM32MP135的Linux开发板等 …

Redis使用总结

NoSQL 1.1为什么要用NoSQL 面对现在用户数据的急剧上升,我们需要对这些用户数据进行挖掘,传统的关系型数据库已经不适合这些 应用了.Nosql 的发展可以很了的处理这些大的数据. 1.2什么是NoSQL Not Only Sql->NoSQL(不仅仅是SQL) 非关系型数据库.随…

Unity ML-Agents + VScode 环境搭建 Windows

安装Unity 先去官网下载Unity Hub,然后安装在D盘就可以了,你需要手机上安装一个Unity Connect进行账号注册。 详细的注册可以参考: https://blog.csdn.net/Dugege007/article/details/128472571 注册好了以后登入电脑端的Unity Hub&#x…

Linux电源管理(2)_常规的电源管理的基本概念和软件架构

原文: Linux电源管理(2)_Generic PM之基本概念和软件架构 1. 前言 Linux系统中那些常规的电源管理手段,包括关机(Power off)、待机(Standby or Hibernate)、重启(Reboot)等。这些…

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…

在线教育系统开发常见问题及解决方案:源码部署到运营维护

当下,越来越多的教育机构、企业培训部门以及创业者,选择开发属于自己的在线教育系统。然而,从源码部署到实际运营,整个过程中常常会遇到一系列技术与管理难题。今天,笔者将从在线教育系统源码维护、运营等几个方向为大…

RAG(Retrieval-Augmented Generation,检索增强生成)

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合 信息检索 和 文本生成 的技术,旨在提升大语言模型(LLM)生成内容的准确性和时效性。其核心思想是:先检索相关知识,再基…

项目实战 -- 状态管理

redux基础 还记得好久好久之前就想要实现的一个功能吗? 收起侧边栏折叠菜单,没错,现在才实现 因为不是父子通信,所以处理起来相对麻烦一点 可以使用状态树或者中间人模式 这就需要会redux了 Redux工作流: 异步就…

Go语言之路————指针、结构体、方法

Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go…

[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论

前言: 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素,它弥漫在系统中多维立体空间的不同节点上&am…

JS执行器在UI自动化测试中的应用

前言 在进行UI自动化过程会遇到滚动条下拉、隐藏元素定位、只读属性元素的编辑、富文本处理等,此时可以使用JS执行器简化我们的一些处理操作。 具体应用 JS执行器的使用步骤: 1.先写个JS脚本,如果需要获取操作后的值,JS脚本前面…

解析Suna:全球首款开源通用AI智能体

导语: 嘿,哥们儿,最近 AI Agent 这块儿挺火的,有个叫 Suna 的开源项目冒出来挺快!听说只用了 3 周就开发出来了,但功能上感觉已经能跟那个商业版的 Manus掰掰手腕了。它能帮你搞定浏览器自动化、管文件、爬…

模板方法模式:定义算法骨架的设计模式

模板方法模式:定义算法骨架的设计模式 一、模式核心:模板方法定义算法骨架,具体步骤延迟到子类实现 在软件开发中,经常会遇到这样的情况:某个算法的步骤是固定的,但具体步骤的实现可能因不同情况而有所不…

浅谈Java 内存管理:栈与堆,垃圾回收

在Java编程世界里,内存管理是一项极为关键的技能,它就像程序运行背后的“隐形守护者”,默默影响着程序的性能与稳定性。今天,咱们就来简单学习一下Java内存管理中的两大核心要点:栈与堆的内存分配机制,以及…

【WebGL小知识】WebGL平台上不同Json的比较

今天来总结一下WebGL平台上不同Json插件的差别,话不多说直接开始。 JsonUtility JsonUtility是Unity自带的Json解析,无需另外安装插件。 优点: Unity自带,兼容性好,WebGL平台可以使用轻量级,性能较好。 …