• 人脸识别


    '''
        人脸识别:人脸识别与图像识别的区别在于人脸识别需要识别出两个人的不同点。
            视频捕捉
                通过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
  • 相关阅读:
    ab (ApacheBench)命令
    Linux yum apt-get 方式
    Linux 作业调度器 crond
    FastDFS 注意事项
    FastDFS 搭建
    FastDFS 基础知识
    JS判断web网站访问端是PC电脑还是手机
    C# Json数据反序列化为Dictionary并根据关键字获取指定值1
    C#委托的异步调用1
    C# Json数据反序列化为Dictionary并根据关键字获取指定值
  • 原文地址:https://www.cnblogs.com/yuxiangyang/p/11259105.html
Copyright © 2020-2023  润新知