人脸识别

Posted yuxiangyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人脸识别相关的知识,希望对你有一定的参考价值。

‘‘‘
    人脸识别:人脸识别与图像识别的区别在于人脸识别需要识别出两个人的不同点。
        视频捕捉
            通过OpenCV访问视频捕捉设备(视频头),从而获取图像帧。          
‘‘‘
import cv2 as cv

vc = cv.VideoCapture(./video/2372949.mp4)
while True:
    frame = vc.read()[1]
    cv.imshow(VideoCapture, frame)
    cv.waitKey(33)
    # 阻塞是按了esc键,则返回27
    if cv.waitKey(33) == 27:  # 按了esc键
        break
vc.release()
cv.destroyAllWindows()

  

‘‘‘
    人脸识别之人脸定位:
            import cv2 as cv
            # 通过特征描述文件构建哈尔级联人脸识别器
            fd = cv.CascadeClassifier(‘../data/haar/face.xml‘)
            # 从一个图像中识别出所有的人脸区域
            #     1.3:为最小的人脸尺寸
            #     5:最多找5张脸
            # 返回:
            #     faces: 抓取人脸(矩形区域)列表 [(l,t,w,h),(),()..]
            faces = fd.detectMultiScale(frame, 1.3, 5)
            face = faces[0] # 第一张脸
            # 绘制椭圆
            cv.ellipse(
                face,                 # 图像
                (l + a, t + b),     # 椭圆心
                (a, b),             # 半径
                0,                     # 椭圆旋转角度
                0, 360,             # 起始角, 终止角
                (255, 0, 255),         # 颜色
                2                    # 线宽
            )
‘‘‘

import cv2 as cv

# 哈尔级联人脸定位器
fd = cv.CascadeClassifier(../../data/haar/face.xml)
ed = cv.CascadeClassifier(../../data/haar/eye.xml)
nd = cv.CascadeClassifier(../../data/haar/nose.xml)
vc = cv.VideoCapture(./video/2373181.mp4)
while True:
    frame = vc.read()[1]
    faces = fd.detectMultiScale(frame, 1.3, 5)
    for l, t, w, h in faces:
        a, b = int(w / 2), int(h / 2)
        cv.ellipse(frame, (l + a, t + b), (a, b), 0, 0, 360, (255, 0, 255), 2)
        face = frame[t:t + h, l:l + w]
        eyes = ed.detectMultiScale(face, 1.3, 5)
        for l, t, w, h in eyes:
            a, b = int(w / 2), int(h / 2)
            cv.ellipse(face, (l + a, t + b), (a, b), 0, 0, 360, (0, 255, 0), 2)
        noses = nd.detectMultiScale(face, 1.3, 5)
        for l, t, w, h in noses:
            a, b = int(w / 2), int(h / 2)
            cv.ellipse(face, (l + a, t + b), (a, b), 0, 0, 360, (0, 255, 255), 2)
    cv.imshow(VideoCapture, frame)
    if cv.waitKey(33) == 27:
        break
vc.release()
cv.destroyAllWindows()

 

‘‘‘
简单人脸识别:OpenCV的LBPH(局部二值模式直方图)
‘‘‘

import os
import numpy as np
import cv2 as cv
import sklearn.preprocessing as sp

fd = cv.CascadeClassifier(‘./ml_data/haar/face.xml‘)


def search_faces(directory):
directory = os.path.normpath(directory)

faces =
for curdir, subdirs, files in os.walk(directory):
for jpeg in (file for file in files
if file.endswith(‘.jpg‘)):
path = os.path.join(curdir, jpeg)
label = path.split(os.path.sep)[-2]
if label not in faces:
faces[label] = []
faces[label].append(path)
return faces


train_faces = search_faces(
‘./ml_data/faces/training‘)
codec = sp.LabelEncoder()
codec.fit(list(train_faces.keys()))
train_x, train_y = [], []
for label, filenames in train_faces.items():
for filename in filenames:
image = cv.imread(filename)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
faces = fd.detectMultiScale(gray, 1.1, 2,
minSize=(100, 100))
for l, t, w, h in faces:
train_x.append(
gray[t:t + h, l:l + w])
train_y.append(
codec.transform([label])[0])
train_y = np.array(train_y)
# 局部二值模式直方图人脸识别分类器
model = cv.face.LBPHFaceRecognizer_create()
model.train(train_x, train_y)
test_faces = search_faces(
‘./ml_data/faces/testing‘)
test_x, test_y, test_z = [], [], []
for label, filenames in test_faces.items():
for filename in filenames:
image = cv.imread(filename)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
faces = fd.detectMultiScale(gray, 1.1, 2,
minSize=(100, 100))
for l, t, w, h in faces:
test_x.append(
gray[t:t + h, l:l + w])
test_y.append(
codec.transform([label])[0])
a, b = int(w / 2), int(h / 2)
cv.ellipse(image, (l + a, t + b),
(a, b), 0, 0, 360,
(255, 0, 255), 2)
test_z.append(image)
test_y = np.array(test_y)
pred_test_y = []
for face in test_x:
pred_code = model.predict(face)[0]
pred_test_y.append(pred_code)
escape = False
while not escape:
for code, pred_code, image in zip(
test_y, pred_test_y, test_z):
label, pred_label = \
codec.inverse_transform([code, pred_code])
text = ‘ ‘.format(
label,
‘==‘ if code == pred_code else ‘!=‘,
pred_label)
cv.putText(image, text, (10, 60),
cv.FONT_HERSHEY_SIMPLEX, 2,
(255, 255, 255), 6)
cv.imshow(‘Recognizing...‘, image)
if cv.waitKey(1000) == 27:
escape = True
break

 

以上是关于人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

识别人脸face_recognition实现

Apple Vision Framework 识别人脸

android人脸识别活体识别人脸动作活体静默活体Demo源码实现讲解

人脸识别 介绍

OpenCV中LBPH人脸识别器识别人脸实战(附Python源码)

《刷脸背后:人脸检测 人脸识别 人脸检索 》PDF 学习下载