Advertisement

OpenCV人脸检测与人脸识别

阅读量:

微信搜索关注“咖啡遇上代码”公众号,查看更多

该库是一个开源的计算机视觉工具箱,并包含了许多图像处理和计算机视觉领域的基础算法。本节将集中于OpenCV中的核心算法及其应用,在具体讨论中我们主要聚焦于如何利用这些算法进行人脸检测与识别的过程。

人脸检测

流程

利用OpenCV内置的级联分类器导入配置文件haarcascade_frontalface_default.xml(其Windows路径位于opencv目录下的\build\etc\haarcascades)。

对图像进行灰度化等预处理

该程序将执行指定图片中的人脸探测任务,并返回脸部位置数据。

通过rectangle函数绘制出人脸位置

代码

复制代码
 import cv2 as cv

    
 import numpy as np
    
  
    
 def face_detect(image):
    
     gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    
     face_detector = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
    
     faces = face_detector.detectMultiScale(gray, 1.02, 20)
    
     for x, y, w, h in faces:
    
         cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    
     cv.imshow("face_detect", image)
    
  
    
 def video_face_detect():
    
     capture = cv.VideoCapture(0)
    
     while True:
    
         ret, frame = capture.read()
    
         frame = cv.flip(frame, 1)
    
         face_detect(frame)
    
         c = cv.waitKey(10)
    
         if c==27:  # ESC
    
             break
    
  
    
 if __name__ == '__main__':
    
     src = cv.imread("test.jpg")
    
     face_detect(src)
    
     # video_face_detect()
    
     cv.waitKey(10000)
    
     cv.destroyAllWindows()

人脸识别

流程:

训练

制作人脸数据集,格式为:每个类别一个文件夹

利用OpenCV的人脸识别模块中的EigenFaceRecognizer_create函数生成一个模型,并完成对该模型的训练。

测试

利用人脸检测算法对测试图片中的人脸进行提取

通过模型的predict函数完成对提取的人脸进行识别

代码

复制代码
 import cv2 as cv

    
 import numpy as np
    
 import os
    
 import sys
    
  
    
 def dataset(path):
    
     label = 0
    
     imgs, labels = [], []
    
     for dirname, dirnames, filenames in os.walk(path):
    
         for subdirname in dirnames:
    
             subject_path = os.path.join(dirname, subdirname)
    
             for filename in os.listdir(subject_path):
    
                 filepath = os.path.join(subject_path, filename)
    
                 im = cv.imread(filepath, cv.IMREAD_GRAYSCALE)
    
                 im = cv.resize(im, (200, 200))
    
                 imgs.append(np.asarray(im, dtype=np.uint8))
    
                 labels.append(label)
    
             label += 1
    
     return [imgs, labels]
    
  
    
 def train(imgs, labels):
    
     labels = np.asarray(labels, dtype=np.int32)
    
     model = cv.face.EigenFaceRecognizer_create()
    
     model.train(np.asarray(imgs), np.asarray(labels))
    
     return model
    
  
    
 def test(model, testimg_path):
    
     names = ['joe', 'jane', 'jack', 'Mike']# 每个类别实际对应的名称,按类别文件夹顺序
    
     img = cv.imread(testimg_path)
    
     #人脸检测
    
     face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    
     faces = face_cascade.detectMultiScale(img, 1.1, 1)
    
     #对图片中每个人脸进行识别
    
     for (x, y, w, h) in faces:
    
         img = cv.rectangle(img, (x,y), (x+w, y+h), (255, 0, 0), 2)
    
         gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
         roi = gray[x:x+w, y:y+h]
    
         roi = cv.resize(roi, (200, 200), interpolation=cv.INTER_LINEAR)
    
         params = model.predict(roi)
    
         print("label: %s, confidence: %.3f" % (params[0], params[1]))
    
         cv.putText(img, names[params[0]], (x, y), cv.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
    
     cv.imshow("img", img)
    
     cv.waitKey(10000)
    
     cv.destroyAllWindows()
    
  
    
 if __name__ == '__main__':
    
     data_path = "数据集文件夹根路径"
    
     testimg_path = "测试图片路径"
    
     imgs, labels = dataset(data_path)
    
     model = train(imgs, labels)
    
     test(model, testimg_path)

总结

OpenCV中集成的人脸检测与人脸识别技术虽然有一定实用性,但其识别能力受限于训练数据集中的特定特征。因此,在实际应用场景中其适用性仍然较为有限。对于提升性能的建议,可以参考FaceNet等先进的深度学习方法。

全部评论 (0)

还没有任何评论哟~