zoukankan      html  css  js  c++  java
  • 【人脸检测——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

  • 相关阅读:
    Socket编程
    jdbc03 使用servlet实现
    el和jstl
    java03变量和基本数据类型
    java02
    ssh整合
    U1总结
    多线程
    spring07 JDBC
    cocos2dx中的三种基本的数据类型
  • 原文地址:https://www.cnblogs.com/gfgwxw/p/9605773.html
Copyright © 2011-2022 走看看