zoukankan      html  css  js  c++  java
  • 人脸识别

    '''
        人脸识别:人脸识别与图像识别的区别在于人脸识别需要识别出两个人的不同点。
            视频捕捉
                通过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
  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/yuxiangyang/p/11259105.html
Copyright © 2011-2022 走看看