码迷,mamicode.com
首页 > 其他好文 > 详细

人脸识别

时间:2019-07-28 15:33:34      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:ade   tin   class   enc   sklearn   一个   format   nsf   simple   

‘‘‘
    人脸识别:人脸识别与图像识别的区别在于人脸识别需要识别出两个人的不同点。
        视频捕捉
            通过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

 

人脸识别

标签:ade   tin   class   enc   sklearn   一个   format   nsf   simple   

原文地址:https://www.cnblogs.com/yuxiangyang/p/11259105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!