【人脸检测——Dlib学习1】Face_detector_example

0.目标

本小节解读官网example

1.官网介绍翻译

a. 这个例子展示了如何在一个图像中找到正面的人脸。具体来说,它显示了如何从命令行获取图像列表,并在屏幕上显示每个带有红框的人脸。

 b. Face_detector采用了HOG特征,结合了线性分类器、图像金字塔和滑动窗口检测方案。这种类型的目标检测是非常普遍的,且有能力检测除人脸外许多半刚性目标。因此,如果你对制作你自己的目标检测感兴趣,那么可以阅读train_object_detector.py文件

2.源码解读

# -*-coding:utf-8-*-
#author: lyp time: 2018/9/7
import sys

import dlib

# 初始化程序
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()

# 读取图片,在cmd中键入 python xx(文件名).py 需要识别的图片名
for f in sys.argv[1:]:
    print("Processing file: {}".format(f))
    img = dlib.load_rgb_image(f)

    # 参数1表示我们对图像进行向上采样1倍,这将使一切变的更大
    # 进而让我们检测出更多的人脸
    dets = detector(img, 1)

    # 输出检测出来的人脸个数
    print("Number of faces detected: {}".format(len(dets)))

    # 输出第i张人脸矩形框的位置坐标,详情见下图1
    for i, d in enumerate(dets):
        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
            i, d.left(), d.top(), d.right(), d.bottom()))

    # 绘制人脸矩形轮廓
    win.clear_overlay()
    win.set_image(img)
    win.add_overlay(dets)

    # 等待点击
    dlib.hit_enter_to_continue()

# 下面这部分的功能是输出第i张人脸的得分
# score分数越大,说明detector更确信是人脸
# detector.run中第三个参数是可选择的检测阈值
    # 检测阈值为负,将会返回更多的检测结果
    # 检测阈值为正,将会返回较少的检测结果
# idx将告诉我们是哪个子检测器与图像中第i张人脸匹配。
    # 这将更广泛地用于识别不同方向的人脸
if (len(sys.argv[1:]) > 0):
    img = dlib.load_rgb_image(sys.argv[1])
    dets, scores, idx = detector.run(img, 1, -1)
    for i, d in enumerate(dets):
        print("Detection {}, score: {}, face_type:{}".format(
            d, scores[i], idx[i]))

a.官网例子需要再windows下的cmd中输入命令运行程序,具体原因与操作可以参考:https://www.cnblogs.com/gfgwxw/p/9618133.html。

  这种操作在Windows中非常不友好,各种奇怪的问题。所以,需要更换读取图片的方式

b.我们常用OpenCV处理,下面小节改成OpenCV操作图片。

3. 换为OpenCV后的代码

# -*-coding:utf-8-*-
#author: lyp time: 2018/9/7
import cv2

import dlib

# 初始化程序
detector = dlib.get_frontal_face_detector()


# 读取图片,在cmd中键入 python xx(文件名).py 需要识别的图片名
img = cv2.imread("cba.jpg")


# 参数1表示我们对图像进行向上采样1倍,这将使一切变的更大
# 进而让我们检测出更多的人脸
dets = detector(img, 1)

# 输出检测出来的人脸个数
print("Number of faces detected: {}".format(len(dets)))

# 输出第i张人脸矩形框的位置坐标,详情见下图1
for i, d in enumerate(dets):
    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
        i, d.left(), d.top(), d.right(), d.bottom()))
    cv2.rectangle(img, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0,255, 255),2)

# cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):绘制矩形框图
    # img: 输入的图像
    # pt1: 矩形顶点坐标
    # pt2: 与pt1成对角的顶点坐标
    # color: 矩形框的颜色
    # 2: 所画线的宽度

    # 绘制人脸矩形轮廓
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

# 下面这部分的功能是输出第i张人脸的得分
# score分数越大,说明detector更确信是人脸
# detector.run中第三个参数是可选择的检测阈值
    # 检测阈值为负,将会返回更多的检测结果
    # 检测阈值为正,将会返回较少的检测结果
# idx将告诉我们是哪个子检测器与图像中第i张人脸匹配。
    # 这将更广泛地用于识别不同方向的人脸
dets, scores, idx = detector.run(img, 1, -1)
for i, d in enumerate(dets):
    print("Detection {}, score: {}, face_type:{}".format(
        d, scores[i], idx[i]))

4.致谢

https://www.cnblogs.com/AdaminXie/p/7905888.html

原文地址:https://www.cnblogs.com/gfgwxw/p/9605773.html