分别应用Opencv库和Dlib库进行人脸检测的效果比较,附Python 完整代码

一.应用opencv库进行人脸检测

import cv2#导入opencv库

img=cv2.imread("/home/kd/PycharmProjects/python-pro/datasets/2.jpeg")


# 1、使用 opencv 检测人脸
# 加载人脸检测分类器,位于OpenCV的安装目录下
face_cascade=cv2.CascadeClassifier('/home/kd/anaconda3/envs/tensorflow/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
# 转灰度图
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 检测人脸(可能有多张),返回人脸位置信息(x,y,w,h)
img_faces=face_cascade.detectMultiScale(img_gray)
length=len(img_faces)
print(len(img_faces))
print(img_faces)
for i in range(length):
    cv2.rectangle(img,(img_faces[i][0],img_faces[i][1]),(img_faces[i][0]+img_faces[i][2],img_faces[i][1]+img_faces[i][3]),(0,0,255))
cv2.imshow("pic",img)
cv2.waitKey(0)
face_cascade=cv2.CascadeClassifier("opencv的人脸检测器的位置")

Opencv中自带了人脸检测其,基于Haar算法进行人脸检测.Haar算法的基本思路是这样的, 通过使用一些矩形模板对图像进行扫描,例如下图中的两个矩形模板,中间一副在扫描到眼睛区域的颜色比周边脸颊区域的颜色深,表示符合眼睛的特征;右边一副在扫描到鼻梁时发现鼻梁两侧比鼻梁的颜色要深,符合鼻梁的特征.同样地,在通过其他的矩形模板进行扫描,当发现具有眼睛,鼻梁,嘴巴等特征超过一定的阈值时,则判定为一张人脸.

二,应用Dlib进行人脸检测

import sys
import os
import glob
import dlib
import numpy as np
import cv2
img=cv2.imread("/home/kd/PycharmProjects/python-pro/datasets/8.jpeg")
detector= dlib.get_frontal_face_detector()
#检测出有几张脸在图片中
dets = detector(img, 1)
img_faces=[]
for i,face in enumerate(dets):
    x = dlib.rectangle.left(dets[i])
    y = dlib.rectangle.top(dets[i])
    h = dlib.rectangle.height(dets[i])
    w = dlib.rectangle.width(dets[i])
    img_faces.append([x, y, w, h])
    length = len(img_faces)
    for i in range(length):
        cv2.rectangle(img, (img_faces[i][0], img_faces[i][1]),
             (img_faces[i][0] + img_faces[i][2], img_faces[i][1] + img_faces[i][3]), (0, 0, 255))
cv2.waitKey(0)
detector = dlib.get_frontal_face_detector()
dets = detector(img, 1)

 上示代码进行Dlib人脸检测,detector返回的为图中脸的张数,可通过len(dets)得到.

for i,face in enumerate(dets):
    x = dlib.rectangle.left(dets[i])
    y = dlib.rectangle.top(dets[i])
    h = dlib.rectangle.height(dets[i])
    w = dlib.rectangle.width(dets[i])
    img_faces.append([x, y, w, h])
    length = len(img_faces)

 通过循环取得脸部矩形框的(x,y,w,h)

三.结果比较

通过实验同一张图片,Dlib的准确率更高.

猜你喜欢

转载自blog.csdn.net/u014285910/article/details/84677301