python-opencv 使用LBP特征检测人脸

概述

最近在做人脸检测相关功能,目前注意到比较传统(非深度)人脸检测特征包括harr和LBP(HOG用于行人检测更多些),opencv包括了这两种特征算法,并且相对来说,LBP更快,这是一个比较大的优点,我决定试一试。这里就是我测试的记录。

感受:opencv实现的LBP人脸检测确实快,但是官方的模型文件对于侧脸和歪脸很弱,容易漏检。可能是因为官方没有针对这些情况训练,只针对正脸。真是使用的话,还要根据需求重新训练,使之更健壮

感受2:不能实时的检测都是耍流氓

补充:有个非开源、提供dll文件的LBP方案在github上,很多人用,建议参考下:https://github.com/ShiqiYu/libfacedetection

环境:

  • i78850U 笔记本
  • win10 64位
  • python3.6
  • python-opencv3.3

测试结果:

  • 视频分辨率640X480
  • 单人脸
  • 每100帧求一次平均,每帧时间约20ms
  • 刨除了取帧和显示的时间,仅仅计算检测的时间

代码:

代码从opencv的官方例子修改过来的,可以单文件运行,有python-opencv就行。

注意:lbpcascade_frontalface_improved.xml这个文件在opencv的源码目录的data子目录下面,请填写正确的路径

注意2:按delete键退出程序

import time
import cv2

def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
                                     flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

def draw_rects(img, rects, color):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

if __name__ == '__main__':
    video_src = 0
    cascade_fn = "./lbpcascades/lbpcascade_frontalface_improved.xml"
    cascade = cv2.CascadeClassifier(cascade_fn)

    cam = cv2.VideoCapture(video_src)

    index = 0
    time_sum = 0.0
    old_sum = 0.0
    while True:
        index += 1
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)

        t = time.time()
        rects = detect(gray, cascade)
        dt = time.time() - t
        time_sum += dt

        vis = img.copy()
        if len( rects ) > 0:
            draw_rects( vis, rects, (0, 255, 0) )
        else:
            print("no face found")

        if index%100 == 0:
            old_sum = time_sum
            time_sum = 0.0

        if old_sum > 0.0001:
            cv2.putText( vis, '100 pics, average time: {} s'.format( round( old_sum/100.0, 4 ) ),
                             (20, 20), cv2.FONT_HERSHEY_PLAIN, 2, (0, 255, 0), 2 )
        cv2.imshow( 'facedetect', vis )

        key_ret = cv2.waitKey( 1 )
        if (key_ret == 0):  # if delete key is pressed
            break
    cam.release()
    cv2.destroyAllWindows()

你可能感兴趣的:(python,这就是opencv)