OpenCV人脸检测与人脸识别
OpenCV是开源的计算机视觉库,实现了很多图像处理和计算机视觉方面的通用算法。下面主要OpenCV中的内置算法来实现人脸检测与人脸识别。
人脸检测
流程
-
通过OpenCV自带的级联分类器来加载人脸检测的相关文件haarcascade_frontalface_default.xml(Windows版路径为opencv目录下的\build\etc\haarcascades\)
-
对图像进行灰度化等预处理
-
通过detectMultiScale函数完成对指定图片中的人脸进行检测(函数返回的为脸位置信息)
-
通过rectangle函数绘制出人脸位置
代码
import cv2 as cv
import numpy as npdef 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: # ESCbreakif __name__ == '__main__':src = cv.imread("test.jpg")face_detect(src)# video_face_detect()cv.waitKey(10000)cv.destroyAllWindows()
人脸识别
流程:
训练
-
制作人脸数据集,格式为:每个类别一个文件夹
-
通过OpenCV中的face人脸模块中的EigenFaceRecognizer_create函数来创建一个模型,并依据数据集完成对模型的训练
测试
-
利用人脸检测算法对测试图片中的人脸进行提取
-
通过模型的predict函数完成对提取的人脸进行识别
代码
import cv2 as cv
import numpy as np
import os
import sysdef dataset(path):label = 0imgs, 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 += 1return [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 modeldef 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框架。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
