opencv入门基础(七)基于dlib进行本地图片、实时人脸检测

一.背景知识

1.Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口。
2.由于Dlib对于人脸特征提取效果很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识别开发很适合做人脸识别项目开发。

二.HOG算法

HOG(Histogram of Oriented Gradient)方向梯度直方图
1.HOG是一种特征描述子,通常用于从图像数据中提取特征。它广泛应用于计算机视觉人物的物体检测。
2.特征描述子的作用:它是图像的简化表示,仅包含有关图像的最重要信息。
论文:Histogram of Oriented Gradients for Human Detection

二.实践具体过程

本地照片dlib分类器人脸检测

# 导入库
# 显示图片
# 绘制人脸矩形框
# 主函数
  # 读取一张图片
  # 灰度转换
  # 调用dlib库中的检测器
  # 给检测出的人脸绘制矩形框
  # 创建画布
  # 显示最终检测结果
import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt
def show_image(image,title):
    img_RGB = image[:,:,::-1]
    plt.title(title)
    plt.imshow(img_RGB)
    plt.axis("off")
def plot_rectangle(image,faces):
    for face in faces:
        cv2.rectangle(image,(face.left(),face.top()),(face.right(),face.bottom()),(255,255,255),4)
    return image  # 拿进来的图片没有矩形框,返回的图片标了矩形框
def main():
    img = cv2.imread("university.jpg")
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    detector = dlib.get_frontal_face_detector()  # 调用检测器
    dets_result = detector(gray,1)  # 将gray参数给检测器,1代表把照片放大一倍,以确保检测效果更好
    image_result = plot_rectangle(img.copy(),dets_result)  # 给检测出的人脸绘制矩形框
    plt.figure(figsize=(9,6))
    plt.suptitle("face detection with dlib",fontsize=14,fontweight='bold')
    show_image(image_result,"face detection")
    plt.show()

main()

在这里插入图片描述
用dlib进行人脸检测,对于一些侧脸,扭转角度较大的脸,检测效果还是不好,深度学习的方法才会很大的提高识精度。

四.dlib摄像头实时识别人脸

# 导入库
# 绘制人脸矩形框
# 主函数
  # 打开摄像头
  # 判断摄像头是否正常工作
  # 摄像头正常打开:循环读取每一帧
  # 调用dlib苦中的检测器
  # 绘制检测效果
  # 实时显示最终的检测效果
  # 按键退出
  # 释放资源
import cv2
import dlib
def plot_rectangle(image,faces):
    # 拿到检测到的人脸数据,返回四个值:坐标(x,y),矩形框宽和高width,height
    for face in faces:
        cv2.rectangle(image,(face.left(),face.top()),(face.right(),face.bottom()),(0,0,255),4)  # 画矩形框需要对角线点的坐标
    return image
def main():
    capture = cv2.VideoCapture(0)
    if capture.isOpened() is False:
        print("Camera Error!")
    while True:
        ret,frame = capture.read()
        if ret:
            gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
            detector = dlib.get_frontal_face_detector()  # 调用检测器
            dets_result = detector(gray, 1)  # 将gray参数给检测器,1代表把照片放大一倍,以确保检测效果更好
            test_image = plot_rectangle(frame, dets_result)  # 给检测出的人脸绘制矩形框
            cv2.imshow("face detection with dlib",test_image)
            if cv2.waitKey(1) == 27:
                break

    capture.release()
    cv2.destroyAllWindows()

main()

在这里插入图片描述
基于dlib的人脸实时监测算法比较古老,实时性较差。

更多推荐