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

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 函数对每个文件进行人脸检测和显示。


http://www.kler.cn/a/400012.html

相关文章:

  • 美赛优秀论文阅读--2023C题
  • prop校验,prop和data区别
  • 本草智控:中药实验管理的智能时代
  • Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题
  • 深度学习transformer
  • C语言剖析:srand()/rand()/time()
  • OSRM docker环境启动
  • blockchain实现遇到的问题
  • 【前端知识】前端打包工具webpack深度解读
  • 跨平台WPF框架Avalonia教程 十六
  • apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义【二】
  • Tomcat(17) 如何在Tomcat中配置访问日志?
  • Spring Boot3自定义starter
  • PHP 伪静态详解及实现方法
  • java如何利用流式计算筛选出同一天时间最新的一条数据
  • 深度学习:卷积神经网络的计算复杂度,顺序操作,最大路径长度
  • 【鸿蒙开发】第十一章 Stage模型应用组件-任务Mission
  • MTU-内核态(数据链路层或网络接口上能够传输的最大数据包大小)
  • uniapp开发微信小程序笔记3-全局配置、导航栏配置、tabBar配置
  • [N1CTF 2018]eating_cms
  • uni-app项目搭建(ts+Vue3+pinia+vite)
  • StructuredStreaming (二)——kafka
  • Docker: ubuntu系统下Docker的安装
  • 免费开源!DBdoctor推出开源版系统诊断工具systool
  • Android屏幕横竖屏切换和生命周期
  • Hadoop 3.x 新特性详解