• 人脸识别


    '''
        人脸识别:人脸识别与图像识别的区别在于人脸识别需要识别出两个人的不同点。
            视频捕捉
                通过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
  • 相关阅读:
    UVA 439 Knight Moves
    UVA 673 Parentheses Balance
    UVa 536 Tree Recovery
    UVA 712 S-Trees
    UVA 12657 Boxes in a Line
    UVA 679 Dropping Balls
    UVA 1603 Square Destroyer
    UVA 1343 The Rotation Game
    UVA 1374 Power Calculus
    UVA 12558 Egyptian Fractions (HARD version)
  • 原文地址:https://www.cnblogs.com/yuxiangyang/p/11259105.html
Copyright © 2020-2023  润新知