Python 人脸检测:使用 Dlib 和 OpenCV

简介

本文用Python、Dlib 和 OpenCV 库来检测图像中的人脸,并在人脸上绘制矩形框进行窗口显示。

环境准备

在开始之前,请确保您的计算机上已安装 Python。此外,您还需要安装以下库:

  • dlib:一个包含多种机器学习算法的库,包括人脸检测。
  • opencv-python(即 OpenCV):一个强大的计算机视觉库,用于图像处理和视频分析。
  • numpy:一个用于科学计算的库,用于处理多维数组和矩阵。

您可以使用 pip 来安装这些库:

pip install dlib opencv-python numpy

另外,dlib的安装可能出现问题,可以参考该文:https://blog.csdn.net/qq_43466323/article/details/120855699

代码解析

import dlib
import cv2
import numpy as np
from pathlib import Path
from time import time

# 加载dlib人脸检测器
detector = dlib.get_frontal_face_detector()


def read_image(file, flags=1):
    """读取图像,特别适合文件路径出现中文的情况"""
    return cv2.imdecode(np.fromfile(file, np.uint8), flags)


def scale_image(img, max_width=1920, max_height=1080):
    """比例缩放图片"""
    # 获取原始图片的尺寸
    height, width = img.shape[:2]
    # 只有图片宽度或高度超出指定范围,才缩放图片
    if width > max_width or height > max_height:
        # 计算缩放比例
        ratio = min(max_width / width, max_height / height)
    else:
        ratio = 1
    # 缩放图片
    return cv2.resize(img, None, fx=ratio, fy=ratio)


def detect_image(img):
    """人脸检测并绘制人脸矩形框  """
    # 只对BGR图转化灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 检测人脸
    faces = detector(gray)
    # 绘制人脸矩形框
    for face in faces:
        x, y, w, h = face.left(), face.top(), face.width(), face.height()
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    return img


def run(file):
    """将绘制人脸矩形框的图片进行显示"""
    start_time = time()
    # 人脸检测
    img = detect_image(scale_image(read_image(file)))
    # 计算人脸检测耗时并作为窗口标题显示
    win_name = f'duration:{time() - start_time:.2f}'
    cv2.imshow(win_name, img)
    key = cv2.waitKey()
    cv2.destroyAllWindows()
    return key


def run_many(dir_path):
    """依次检测指定目录的图片并显示"""
    print('温馨提示:按q键退出,其他按键切换图片')
    for file in Path(dir_path).iterdir():
        # 按q键退出
        if ord('q') == run(file):
            break

导入库

import dlib
import cv2
import numpy as np
from pathlib import Path
from time import time

这段代码导入了我们所需的所有外部库。

初始化人脸检测器

detector = dlib.get_frontal_face_detector()

这行代码初始化了 Dlib 的人脸检测器,用于后续的人脸检测操作。

读取图像函数

def read_image(file, flags=1):
    return cv2.imdecode(np.fromfile(file, np.uint8), flags)

这个函数用于读取图像文件,特别适合处理包含中文路径的文件。

缩放图像函数

def scale_image(img, max_width=1920, max_height=1080):
    height, width = img.shape[:2]
    if width > max_width or height > max_height:
        ratio = min(max_width / width, max_height / height)
    else:
        ratio = 1
    return cv2.resize(img, None, fx=ratio, fy=ratio)

这个函数用于按比例缩放图像,以确保图像的宽度和高度不会超过指定的最大值。

人脸检测函数

def detect_image(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    for face in faces:
        x, y, w, h = face.left(), face.top(), face.width(), face.height()
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    return img

这个函数将图像转换为灰度图,然后使用 Dlib 的检测器来检测人脸,并在每个检测到的人脸周围绘制一个绿色的矩形框。

运行检测函数(主函数)

def run(file):
    start_time = time()
    img = detect_image(scale_image(read_image(file)))
    win_name = f'duration:{time() - start_time:.2f}'
    cv2.imshow(win_name, img)
    key = cv2.waitKey()
    cv2.destroyAllWindows()
    return key

这个函数读取一个图像文件,对其进行缩放和人脸检测,然后显示结果。

批量检测函数(主函数)

def run_many(dir_path):
    print('温馨提示:按q键退出,其他按键切换图片')
    for file in Path(dir_path).iterdir():
        if ord('q') == run(file):
            break

这个函数遍历指定目录下的所有图像文件,并使用 run 函数对每个文件进行人脸检测和显示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

selenium元素定位---元素点击交互异常解决方法

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、异常原因 在编写ui自动化时,执行报错元素无法点击:ElementClickInterceptedException 具体报错:selenium.common.exc…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

搭建MC服务器

局域网中玩MC,直接自己创建房间开启局域网就可以了。如果想开一个24小时不关机的服务器呢?其实最开始我是想在windows云服务器,图形化界面运行一个开启局域网即可。可能是云服务器上没有显卡,还是其他什么原因,游戏打开…

数据结构-二叉搜索树(Java语言)

目录 1.概念 2.查找search 3.插入insert ​编辑4.删除remove(难点) 5.性能分析 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 : 1.若它的左子树不为空,则左子树上所有节点的值都…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后,全面转型新质课程规划,传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代,电气时代,信息时代;主要生产力-人力转为人脑&…

【Pikachu】PHP反序列化RCE实战

痛是你活着的证明 1.PHP反序列化概述 在理解 PHP 中 serialize() 和 unserialize() 这两个函数的工作原理之前,我们需要先了解它们各自的功能及其潜在的安全隐患。接下来,我会对相关概念做更详细的扩展解释。 1. 序列化 serialize() 序列化&#xff…

Stable Diffusion概要讲解

🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…

免费开源!DBdoctor推出开源版系统诊断工具systool

​前言 在开发和运维过程中,经常会遇到难以定位的应用问题,我们通常需要借助Linux系统资源监控工具来辅助诊断。然而,系统的IO、网络、CPU使用率以及文件句柄等信息通常需要通过多个独立的命令工具来获取。在没有部署如Prometheus这样的综合…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…

FPGA开发流程

注:开发板:小梅哥的ACX720。本实验可直接运行在小梅哥的ACX720开发板上,后续的实验都可直接运行在小梅哥的ACX720上。 一、打开VIVADO并创建工程 1、双击VIVADO图标,打开vivado。 2、打开vivado界面打,点击有 Create …

【深度学习】wsl-ubuntu深度学习基本配置

配置pip镜像源 这里注意一点,你换了源之后就最好不要开代理了,要不然搞不好下载失败,pip和conda都是 ## 配置中科大镜像 pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple# 配置阿里源 pip config set global…

基于Cnn神经网络虫害预测

【摘 要】鉴于农业病虫害经济损失的预测具有较强的复杂性和非线性特性,设计了一种新型的GRNN预测模型,对农业病虫害经济损失进行预测。该模型基于人工神经网络捕捉非线性变化独特的优越性,在神经网络技术和江苏省气象局提供的数据的基础上&am…

【AI图像生成网站Golang】项目介绍

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 简介 本教程将手把手教你如何从零开始构建一个简单的AI图像生成网站。网站主要包含用户注册、图像生成、分类管理等…

单片机学习笔记 4. 蜂鸣器滴~滴~滴~

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯 目录 0、实现的功能 1、Keil工程 1-1 蜂鸣器工作原理 1-2 三极管工作原理 1-3 蜂鸣器原理图 2、代码实现 0、实现的功能 使蜂鸣器滴~滴~滴~ 1…

Shell脚本6 -- 条件判断if

声明: 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c…

SAM_Med2D 训练完成后boxes_prompt没有生成mask的问题

之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记(续):训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…

3.1 数据链路层功能概述

1、思维导图 2、数据链路层基本概念 结点:主机、路由器链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路:网络中两个结点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加…

vue面试题8|[2024-11-14]

问题1:什么是渐进式框架? vue.js router vuex element ...插件 vue.js 渐0 router 渐1 vuex 渐2 vue.js只是一个核心库,比如我再添加一个router或者vuex,不断让项目壮大,就是渐进式框…

使用TensorFlow实现简化版 GoogLeNet 模型进行 MNIST 图像分类

在本文中,我们将使用 TensorFlow 和 Keras 实现一个简化版的 GoogLeNet 模型来进行 MNIST 数据集的手写数字分类任务。GoogLeNet 采用了 Inception 模块,这使得它在处理图像数据时能更高效地提取特征。本教程将详细介绍如何在 MNIST 数据集上训练和测试这…

2.5D视觉——Aruco码定位检测

目录 1.什么是Aruco标记2.Aruco码解码说明2.1 Original ArUco2.2 预设的二维码字典2.3 大小Aruco二维码叠加 3.函数说明3.1 cv::aruco::detectMarkers3.2 cv::solvePnP 4.代码注解4.1 Landmark图说明4.2 算法源码注解 1.什么是Aruco标记 ArUco标记最初由S.Garrido-Jurado等人在…