Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于欧氏距离的人脸识别_Python_Opencv_Raspberry Pi_Raspbian - Fatal编程技术网

Python 基于欧氏距离的人脸识别

Python 基于欧氏距离的人脸识别,python,opencv,raspberry-pi,raspbian,Python,Opencv,Raspberry Pi,Raspbian,我有一个用Python做人脸识别的项目。我想在我的代码中加入欧几里德距离,以了解实时视频和数据集(图像)之间的距离 我很困惑,因为它是实时的。例如,许多项目只是解释图像“X”和图像“Y”之间的欧几里德距离。有人能帮我理解如何在实时视频中做到这一点吗 代码如下: import sys import os impo rt numpy as np from face_recognition_system.videocamera import VideoCamera from face_recognit

我有一个用Python做人脸识别的项目。我想在我的代码中加入欧几里德距离,以了解实时视频和数据集(图像)之间的距离

我很困惑,因为它是实时的。例如,许多项目只是解释图像“X”和图像“Y”之间的欧几里德距离。有人能帮我理解如何在实时视频中做到这一点吗

代码如下:

import sys
import os
impo rt numpy as np
from face_recognition_system.videocamera import VideoCamera
from face_recognition_system.detectors import FaceDetector
import face_recognition_system.operations as op
import cv2
from cv2 import __version__

def get_images(frame, faces_coord, shape):

if shape == "rectangle":
    faces_img = op.cut_face_rectangle(frame, faces_coord)
    frame = op.draw_face_rectangle(frame, faces_coord)
elif shape == "ellipse":
    faces_img = op.cut_face_ellipse(frame, faces_coord)
    frame = op.draw_face_ellipse(frame, faces_coord)
faces_img = op.normalize_intensity(faces_img)
faces_img = op.resize(faces_img)
return (frame, faces_img)

def add_person(people_folder, shape):
    person_name = raw_input('What is the name of the new person: ').lower()
folder = people_folder + person_name
if not os.path.exists(folder):
    raw_input("I will now take 20 pictures. Press ENTER when ready.")
    os.mkdir(folder)
    video = VideoCamera()
    detector = FaceDetector('face_recognition_system/frontal_face.xml')
    counter = 1
    timer = 0
    cv2.namedWindow('Video Feed', cv2.WINDOW_AUTOSIZE)
    cv2.namedWindow('Saved Face', cv2.WINDOW_NORMAL)
    while counter < 21:
        frame = video.get_frame()
        face_coord = detector.detect(frame)
        if len(face_coord):
            frame, face_img = get_images(frame, face_coord, shape)
            # save a face every second, we start from an offset '5' because
            # the first frame of the camera gets very high intensity
            # readings.
            if timer % 100 == 5:
                cv2.imwrite(folder + '/' + str(counter) + '.jpg',
                            face_img[0])
                print 'Images Saved:' + str(counter)
                counter += 1
                cv2.imshow('Saved Face', face_img[0])

        cv2.imshow('Video Feed', frame)
        cv2.waitKey(50)
        timer += 5
else:
    print "This name already exists."
    sys.exit()

def recognize_people(people_folder, shape):
try:
    people = [person for person in os.listdir(people_folder)]
except:
    print "Have you added at least one person to the system?"
    sys.exit()
print "This are the people in the Recognition System:"
for person in people:
    print "-" + person

print 30 * '-'
print "   POSSIBLE RECOGNIZERS TO USE"
print 30 * '-'
print "1. EigenFaces"
print "2. FisherFaces"
print "3. LBPHFaces"
print 30 * '-'

choice = check_choice()

detector = FaceDetector('face_recognition_system/frontal_face.xml')
if choice == 1:
    recognizer = cv2.face.createEigenFaceRecognizer()
    threshold = 4000
elif choice == 2:
    recognizer = cv2.face.createFisherFaceRecognizer()
    threshold = 300
elif choice == 3:
    recognizer = cv2.face.createLBPHFaceRecognizer()
    threshold = 105
images = []
labels = []
labels_people = {}
for i, person in enumerate(people):
    labels_people[i] = person
    for image in os.listdir(people_folder + person):
        images.append(cv2.imread(people_folder + person + '/' + image, 0))
        labels.append(i)
try:
    recognizer.train(images, np.array(labels))
except:
    print "\nOpenCV Error: Do you have at least two people in the database?\n"
    sys.exit()

video = VideoCamera()
while True:
    frame = video.get_frame()
    faces_coord = detector.detect(frame, False)
    if len(faces_coord):
        frame, faces_img = get_images(frame, faces_coord, shape)
        for i, face_img in enumerate(faces_img):
            if __version__ == "3.1.0":
                collector = cv2.face.MinDistancePredictCollector()
                recognizer.predict(face_img, collector)
                conf = collector.getDist()
                pred = collector.getLabel()
            else:
                pred, conf = recognizer.predict(face_img)
            print "Prediction: " + str(pred)
            print 'Confidence: ' + str(round(conf))
            print 'Threshold: ' + str(threshold)
            if conf < threshold:
                cv2.putText(frame, labels_people[pred].capitalize(),
                            (faces_coord[i][0], faces_coord[i][1] - 2),
                            cv2.FONT_HERSHEY_PLAIN, 1.7, (206, 0, 209), 2,
                            cv2.LINE_AA)
            else:
                cv2.putText(frame, "Unknown",
                            (faces_coord[i][0], faces_coord[i][1]),
                            cv2.FONT_HERSHEY_PLAIN, 1.7, (206, 0, 209), 2,
                            cv2.LINE_AA)

    cv2.putText(frame, "ESC to exit", (5, frame.shape[0] - 5),
                cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2, cv2.LINE_AA)
    cv2.imshow('Video', frame)
    if cv2.waitKey(100) & 0xFF == 27:
        sys.exit()

def check_choice():
""" Check if choice is good
"""
is_valid = 0
while not is_valid:
    try:
        choice = int(raw_input('Enter your choice [1-3] : '))
        if choice in [1, 2, 3]:
            is_valid = 1
        else:
            print "'%d' is not an option.\n" % choice
    except ValueError, error:
        print "%s is not an option.\n" % str(error).split(": ")[1]
return choice

if __name__ == '__main__':
print 30 * '-'
print "   POSSIBLE ACTIONS"
print 30 * '-'
print "1. Add person to the recognizer system"
print "2. Start recognizer"
print "3. Exit"
print 30 * '-'

CHOICE = check_choice()

PEOPLE_FOLDER = "face_recognition_system/people/"
SHAPE = "ellipse"

if CHOICE == 1:
    if not os.path.exists(PEOPLE_FOLDER):
        os.makedirs(PEOPLE_FOLDER)
    add_person(PEOPLE_FOLDER, SHAPE)
elif CHOICE == 2:
    recognize_people(PEOPLE_FOLDER, SHAPE)
elif CHOICE == 3:
sys.exit()
导入系统 导入操作系统 将numpy作为np导入 从人脸识别系统。摄像机导入摄像机 从face_recognition_system.Detector导入face Detector 导入人脸识别系统。操作为op 进口cv2 从cv2导入版本__ def获取图像(帧、面坐标、形状): 如果形状=“矩形”: 面\u img=op.cut\u面\u矩形(框架、面\u坐标) 框架=操作绘制面矩形(框架、面坐标) elif形状==“椭圆”: 面\u img=op.cut\u面\u椭圆(框架、面\u坐标) 框架=操作绘制面椭圆(框架、面坐标) 面\u img=op.normalize\u强度(面\u img) 面\u img=op.resize(面\u img) 返回(帧、面和图像) def添加人物(人物文件夹,形状): person_name=raw_input('新人员的姓名:')。lower() 文件夹=人员文件夹+人员名称 如果不存在os.path.exists(文件夹): 原始输入(“我现在将拍摄20张照片。准备好后按ENTER键。”) os.mkdir(文件夹) 摄像机 检测器=人脸检测器('face\u recognition\u system/frontial\u face.xml') 计数器=1 计时器=0 cv2.namedWindow(“视频馈送”,cv2.WINDOW\u自动调整大小) cv2.namedWindow(“保存的面”,cv2.WINDOW\u正常) 当计数器<21时: frame=video.get_frame() 面坐标=检测器。检测(帧) 如果len(面对面协调): 帧,面\u img=获取图像(帧,面\u坐标,形状) #每秒钟保存一张脸,我们从偏移量“5”开始,因为 #相机的第一帧强度非常高 #阅读资料。 如果计时器%100==5: cv2.imwrite(文件夹+'/'+str(计数器)+'.jpg', 面(图[0]) 打印“已保存图像:”+str(计数器) 计数器+=1 cv2.imshow('保存的脸',脸\u img[0]) cv2.imshow(“视频馈送”,帧) cv2.等待键(50) 定时器+=5 其他: 打印“此名称已存在。” sys.exit() def识别人物(人物文件夹、形状): 尝试: people=[os.listdir(people\u文件夹)中的人员对应人员] 除: 打印“您是否至少向系统添加了一个人?” sys.exit() 打印“这是识别系统中的人员:” 对于人与人之间的关系: 打印“-”+人 打印30*'-' 打印“可能使用的识别器” 打印30*'-' 打印“1.特征面” 打印“2.鱼面” 打印“3.LBPHFaces” 打印30*'-' choice=检查选项() 检测器=人脸检测器('face\u recognition\u system/frontial\u face.xml') 如果选项==1: 识别器=cv2.face.CreateEigenFaceRecognitor() 阈值=4000 elif选项==2: 识别器=cv2.face.createFisherFaceRecognizer() 阈值=300 elif选项==3: recognizer=cv2.face.createLBPHFaceRecognizer() 阈值=105 图像=[] 标签=[] 标签_人={} 对于i,枚举中的人(人): 标签(人)(i)=人 对于os.listdir(人员文件夹+人员)中的图像: images.append(cv2.imread(people_folder+person+'/'+image,0)) 标签.附加(i) 尝试: 识别器.序列(图像,np.数组(标签)) 除: 打印“\n密码错误:数据库中至少有两个人吗?\n” sys.exit() 摄像机 尽管如此: frame=video.get_frame() 面坐标=检测器。检测(帧,假) 如果len(面对合作): 帧,面\u img=获取图像(帧,面\u坐标,形状) 对于i,枚举中的faces\u img(faces\u img): 如果版本为3.1.0: 收集器=cv2.face.MindDistancePredictCollector() 识别器。预测(面部图像、收集器) conf=collector.getDist() pred=collector.getLabel() 其他: pred,conf=recognizer.predict(面部表情) 打印“预测:”+str(pred) 打印“信心:”+str(圆形(形态)) 打印“阈值:”+str(阈值) 如果conf<阈值: cv2.putText(框架,标签为人[pred]。大写(), (faces_coord[i][0],faces_coord[i][1]-2), cv2.FONT_HERSHEY_PLAIN,1.7,(206,0209),2, cv2.线路(AA) 其他: cv2.putText(框架,“未知”, (faces_coord[i][0],faces_coord[i][1]), cv2.FONT_HERSHEY_PLAIN,1.7,(206,0209),2, cv2.线路(AA) cv2.putText(框架,“ESC退出”,(5,框架形状[0]-5), cv2.FONT_HERSHEY_平原,1.2,(206,0209),2,cv2.LINE_AA) cv2.imshow(“视频”,帧) 如果cv2.waitKey(100)&0xFF==27: sys.exit() def check_choice(): “检查选择是否正确 """ _是否有效=0 虽然无效,但: 尝试: choice=int(原始输入('输入您的选项[1-3]:')) 如果在[1,2,3]中选择: _是否有效=1 其他: 打印“%d”不是选项。\n“%d”选项 除ValueError外,错误: 打印“%s”不是选项。\n“%str(错误)。拆分(“:”[1] 返回选择 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 打印30*'-' 打印“可能的操作” 打印30*'-' 打印“1.将人员添加到识别器系统” 打印“2.启动识别器” 打印“3.退出” 打印30*'-' CHOICE=检查选项() PEOPLE\u FOLDER=“人脸识别系统/PEOPLE/” SHAPE=“椭圆” 如果选项==1: 如果不存在os.path.exists(人员文件夹): os.makedirs(人员文件夹) 添加人物(人物文件夹、形状) elif选项==2: 识别人物(人物文件夹,SH)