使用CV2中Harr分类器进行实时人脸检测并保存图片

环境:windows10
python 3.6.8
opencv-python 4.1.0.25

目的:输入一张图片,识别图片中的人像,并且框出人脸区域,并且将图像进行保存

代码分享

import cv2

# Get user supplied values
imagePath ='C:\\100-personal\\10-pic\\dong.jpg'

# Read the image
image = cv2.imread(imagePath)
# turn the image to Gray
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Create the haar cascade
faceCascade =cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

# Detect face in the image
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5
)
print("Found {0} faces!".format(len(faces)))

# Draw a rectangle around the faces
for (x,y,w,h) in faces:
    cv2.rectangle(image, (x,y), (x+w, y+h), (0,255,0), 2)

cv2.imshow("Faces found", image)
cv2.imwrite("C:\\Users\\admin\\Desktop\\result\\result.jpg", image)
cv2.waitKey(0)

代码中注意事项

  1. 给定的imagePath是一个绝对路径,也可以输入相对路径
  2. 本程序支持图片中有多个人脸

技术点分享

  1. Haar分类器= Haar-like特征+积分图方法+ AdaBoost+级联
  2. haarcascade_frontalface_default.xml是openCV自带的检测人脸的模型,另外还提供其他部位的检测模型,如下所示,有专门的左眼识别,右眼识别,笑脸识别,全身识别等模型,可以修改模型名称,以查看不同的效果


    QQ截图20190813204938.png

思考:既然对于单张图片可以进行人脸检测,那么对于连续图片,即视频流应该可以实现实时识别的效果,因此引申出以下功能代码,使用网络摄像头抓取图像,并且实时进行人脸检测,当检测到人脸即将面部区域的图像进行截取,并且保存,直至保存指定的图片数为止。

代码分享

import cv2
import sys
from PIL import Image

def catch_pic_from_video(window_name, camera_idx, catch_pic_num, path_name):
    cv2.namedWindow(window_name)
    cap = cv2.VideoCapture(camera_idx) 
    
    # Create the haar cascade
    faceCascade =cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
    
    num=0
    while cap.isOpened():
        ok, frame = cap.read()
        if not ok:
            break
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
        
        # Detect face in the image
        faces = faceCascade.detectMultiScale(
            gray,
            scaleFactor=1.1,
            minNeighbors=5
        )
        
        if len(faces)>0:    
            # Draw a rectangle around the faces
            for (x,y,w,h) in faces:
                
                img_name = '%s/%d.jpg'%(path_name, num)
                image = frame[y-10 : y+h+10, x-10 : x+w+10]
                cv2.imwrite(img_name, image)
                
                num += 1
                if(num > catch_pic_num):
                    break;
                
                # show the num of detected faces
                font = cv2.FONT_HERSHEY_SIMPLEX
                cv2.putText(frame, "num:%d"%(num), (x+30,y+30), font, 1, (255,0,255), 4)
                
    
        if(num > catch_pic_num):
            break;
        # show the image
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break
   
    cap.release()
    cv2.destroyAllWindows()
    
if __name__ == '__main__':
    if len(sys.argv) != 1:
        print('----------------')
    else:
        catch_pic_from_video("Capture Faces", 0, 1280, 'C:\\eclipse\\workspace\\detectFaceFromVideo\\src\\data\\faces')

以上代码实现从网络摄像头检测人脸,并且将检测到的人脸区域截图,保存到指定的路径下,保存图像的数量是1280张。
之后可以对保存的图像进行人脸识别模型训练,完成人脸的识别,未完待续。。。

你可能感兴趣的:(使用CV2中Harr分类器进行实时人脸检测并保存图片)