python中使用Opencv进行人脸识别

上一节讲到人脸检测,现在讲一下人脸识别。具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别。

人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像   2.从人脸数据库免费获得可用人脸图像,如ORL人脸库(包含40个人每人10张人脸,总共400张人脸),ORL人脸库中的每一张图像大小为92x112。若要对这些样本进行人脸识别必须要在包含人脸的样本图像上进行人脸识别。这里提供自己准备图像识别出自己的方法。

1.采集人脸信息:通过摄像头采集人脸信息,10张以上即可,把图像大小调整为92x112,保存在一个指定的文件夹,文件名后缀为.png

def generator(data):
    ‘‘‘
    打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放
    生成图片满足以下格式:
    1.灰度图,后缀为 .png
    2.图像大小相同
    params:
        data:指定生成的人脸数据的保存路径
    ‘‘‘

    name=input(‘my name:‘)
    #如果路径存在则删除路径
    path=os.path.join(data,name)
    if os.path.isdir(path):
        shutil.rmtree(path)
    #创建文件夹
    os.mkdir(path)
    #创建一个级联分类器
    face_casecade=cv2.CascadeClassifier(‘../haarcascades/haarcascade_frontalface_default.xml‘)
    #打开摄像头
    camera=cv2.VideoCapture(0)
    cv2.namedWindow(‘Dynamic‘)
    #计数
    count=1

    while(True):
        #读取一帧图像
        ret,frame=camera.read()
        if ret:
            #转换为灰度图
            gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
            #人脸检测
            face=face_casecade.detectMultiScale(gray_img,1.3,5)
            for (x,y,w,h) in face:
                #在原图上绘制矩形
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
                #调整图像大小
                new_frame=cv2.resize(frame[y:y+h,x:x+w],(92,112))
                #保存人脸
                cv2.imwrite(‘%s/%s.png‘%(path,str(count)),new_frame)
                count+=1
            cv2.imshow(‘Dynamic‘,frame)
            #按下q键退出
            if cv2.waitKey(100) & 0xff==ord(‘q‘):
                break
    camera.release()
    cv2.destroyAllWindows()

该程序运行后会在指定的data路径下创建一个你输入的人名的文件夹用于存放采集到的图像,在这里我输入了wjy,结果如图

2.人脸识别

OpenCV有3中人脸识别方法,分别基于三个不同算法,分别为Eigenfaces,Fisherfaces和Local Binary Pattern Histogram

这些方法都有类似的一个过程,即先对数据集进行训练,对图像或视频中的人脸进行分析,并且从两个方面确定:1.是否识别到对应的目标,2.识别到的目标的置信度,在实际中通过阈值进行筛选,置信度高于阈值的人脸将被丢弃

这里介绍一下利用特征脸即Eigenfaces进行人脸识别算法,特征脸法本质上就是PCA降维,基本思路是先把图像灰度化,转化为单通道,再将它首位相接转换为列向量,假设图像的大小是20*20的,那么这个向量就是400维,但是维度太高算法复杂度也会升高,所以需要降维,再使用简单排序即可

#载入图像   读取ORL人脸数据库,准备训练数据
def LoadImages(data):
    ‘‘‘
    加载图片数据用于训练
    params:
        data:训练数据所在的目录,要求图片尺寸一样
    ret:
        images:[m,height,width]  m为样本数,height为高,width为宽
        names:名字的集合
        labels:标签
    ‘‘‘
    images=[]
    names=[]
    labels=[]

    label=0

    #遍历所有文件夹
    for subdir in os.listdir(data):
        subpath=os.path.join(data,subdir)
        #print(‘path‘,subpath)
        #判断文件夹是否存在
        if os.path.isdir(subpath):
            #在每一个文件夹中存放着一个人的许多照片
            names.append(subdir)
            #遍历文件夹中的图片文件
            for filename in os.listdir(subpath):
                imgpath=os.path.join(subpath,filename)
                img=cv2.imread(imgpath,cv2.IMREAD_COLOR)
                gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
                #cv2.imshow(‘1‘,img)
                #cv2.waitKey(0)
                images.append(gray_img)
                labels.append(label)
            label+=1
    images=np.asarray(images)
    #names=np.asarray(names)
    labels=np.asarray(labels)
    return images,labels,names

#检验训练结果
def FaceRec(data):
    #加载训练的数据
    X,y,names=LoadImages(data)
    #print(‘x‘,X)
    model=cv2.face.EigenFaceRecognizer_create()
    model.train(X,y)

    #打开摄像头
    camera=cv2.VideoCapture(0)
    cv2.namedWindow(‘Dynamic‘)

    #创建级联分类器
    face_casecade=cv2.CascadeClassifier(‘../haarcascades/haarcascade_frontalface_default.xml‘)    

    while(True):
        #读取一帧图像
        #ret:图像是否读取成功
        #frame:该帧图像
        ret,frame=camera.read()
        #判断图像是否读取成功
        #print(‘ret‘,ret)
        if ret:
            #转换为灰度图
            gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

            #利用级联分类器鉴别人脸
            faces=face_casecade.detectMultiScale(gray_img,1.3,5)

            #遍历每一帧图像,画出矩形
            for (x,y,w,h) in faces:
                frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)  #蓝色
                roi_gray=gray_img[y:y+h,x:x+w]

                try:
                    #将图像转换为宽92 高112的图像
                    #resize(原图像,目标大小,(插值方法)interpolation=,)
                    roi_gray=cv2.resize(roi_gray,(92,112),interpolation=cv2.INTER_LINEAR)
                    params=model.predict(roi_gray)
                    print(‘Label:%s,confidence:%.2f‘%(params[0],params[1]))
                    ‘‘‘
                    putText:给照片添加文字
                    putText(输入图像,‘所需添加的文字‘,左上角的坐标,字体,字体大小,颜色,字体粗细)
                    ‘‘‘
                    cv2.putText(frame,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
                except:
                    continue

            cv2.imshow(‘Dynamic‘,frame)

                #按下q键退出
            if cv2.waitKey(100) & 0xff==ord(‘q‘):
                break
    camera.release()
    cv2.destroyAllWindows()

在程序中,我们用cv2.face.EigenFaceRecognizer_create()创建人脸识别的模型,通过图像数组和对应标签数组来训练模型,该函数有两个重要的参数,1.保留主成分的数目,2.指定的置信度阈值,为一个浮点型。

下面就是基本重复人脸检测的相关操作,通过检测到视频中的人脸进行人脸识别,有如下两个步骤:

1.将检测到的人脸图像调整为92x112,即需要和训练的图像的尺寸相同

2.调用predict()函数进行人脸预测,该函数会返回两个元素的数组,第一个是识别个体的标签,第二个是置信度,越小匹配度越高,0表示完全匹配,需要了解的是不同算法的置信度评分机制不同。

附上结果图

这里附上全部源代码“

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 27 11:43:47 2018

@author: Administrator
"""

‘‘‘
调用opencv的库实现人脸识别
‘‘‘

import cv2
import numpy as np
import os
import shutil

#采集自己的人脸数据
def generator(data):
    ‘‘‘
    打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放
    生成图片满足以下格式:
    1.灰度图,后缀为 .png
    2.图像大小相同
    params:
        data:指定生成的人脸数据的保存路径
    ‘‘‘

    name=input(‘my name:‘)
    #如果路径存在则删除路径
    path=os.path.join(data,name)
    if os.path.isdir(path):
        shutil.rmtree(path)
    #创建文件夹
    os.mkdir(path)
    #创建一个级联分类器
    face_casecade=cv2.CascadeClassifier(‘../haarcascades/haarcascade_frontalface_default.xml‘)
    #打开摄像头
    camera=cv2.VideoCapture(0)
    cv2.namedWindow(‘Dynamic‘)
    #计数
    count=1

    while(True):
        #读取一帧图像
        ret,frame=camera.read()
        if ret:
            #转换为灰度图
            gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
            #人脸检测
            face=face_casecade.detectMultiScale(gray_img,1.3,5)
            for (x,y,w,h) in face:
                #在原图上绘制矩形
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
                #调整图像大小
                new_frame=cv2.resize(frame[y:y+h,x:x+w],(92,112))
                #保存人脸
                cv2.imwrite(‘%s/%s.png‘%(path,str(count)),new_frame)
                count+=1
            cv2.imshow(‘Dynamic‘,frame)
            #按下q键退出
            if cv2.waitKey(100) & 0xff==ord(‘q‘):
                break
    camera.release()
    cv2.destroyAllWindows()

#载入图像   读取ORL人脸数据库,准备训练数据
def LoadImages(data):
    ‘‘‘
    加载图片数据用于训练
    params:
        data:训练数据所在的目录,要求图片尺寸一样
    ret:
        images:[m,height,width]  m为样本数,height为高,width为宽
        names:名字的集合
        labels:标签
    ‘‘‘
    images=[]
    names=[]
    labels=[]

    label=0

    #遍历所有文件夹
    for subdir in os.listdir(data):
        subpath=os.path.join(data,subdir)
        #print(‘path‘,subpath)
        #判断文件夹是否存在
        if os.path.isdir(subpath):
            #在每一个文件夹中存放着一个人的许多照片
            names.append(subdir)
            #遍历文件夹中的图片文件
            for filename in os.listdir(subpath):
                imgpath=os.path.join(subpath,filename)
                img=cv2.imread(imgpath,cv2.IMREAD_COLOR)
                gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
                #cv2.imshow(‘1‘,img)
                #cv2.waitKey(0)
                images.append(gray_img)
                labels.append(label)
            label+=1
    images=np.asarray(images)
    #names=np.asarray(names)
    labels=np.asarray(labels)
    return images,labels,names

#检验训练结果
def FaceRec(data):
    #加载训练的数据
    X,y,names=LoadImages(data)
    #print(‘x‘,X)
    model=cv2.face.EigenFaceRecognizer_create()
    model.train(X,y)

    #打开摄像头
    camera=cv2.VideoCapture(0)
    cv2.namedWindow(‘Dynamic‘)

    #创建级联分类器
    face_casecade=cv2.CascadeClassifier(‘../haarcascades/haarcascade_frontalface_default.xml‘)    

    while(True):
        #读取一帧图像
        #ret:图像是否读取成功
        #frame:该帧图像
        ret,frame=camera.read()
        #判断图像是否读取成功
        #print(‘ret‘,ret)
        if ret:
            #转换为灰度图
            gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

            #利用级联分类器鉴别人脸
            faces=face_casecade.detectMultiScale(gray_img,1.3,5)

            #遍历每一帧图像,画出矩形
            for (x,y,w,h) in faces:
                frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)  #蓝色
                roi_gray=gray_img[y:y+h,x:x+w]

                try:
                    #将图像转换为宽92 高112的图像
                    #resize(原图像,目标大小,(插值方法)interpolation=,)
                    roi_gray=cv2.resize(roi_gray,(92,112),interpolation=cv2.INTER_LINEAR)
                    params=model.predict(roi_gray)
                    print(‘Label:%s,confidence:%.2f‘%(params[0],params[1]))
                    ‘‘‘
                    putText:给照片添加文字
                    putText(输入图像,‘所需添加的文字‘,左上角的坐标,字体,字体大小,颜色,字体粗细)
                    ‘‘‘
                    cv2.putText(frame,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
                except:
                    continue

            cv2.imshow(‘Dynamic‘,frame)

                #按下q键退出
            if cv2.waitKey(100) & 0xff==ord(‘q‘):
                break
    camera.release()
    cv2.destroyAllWindows()

if __name__==‘__main__‘:
    data=‘./face‘
    #generator(data)
    FaceRec(data)
    

2018.10.28

原文地址:https://www.cnblogs.com/do-hardworking/p/9867708.html

时间: 2024-10-20 08:05:21

python中使用Opencv进行人脸识别的相关文章

python中使用Opencv进行人脸检测

这两天学习了人脸识别,看了学长写的代码,边看边码边理解搞完了一边,再又是自己靠着理解和记忆硬码了一边,感觉还是很生疏,就只能来写个随笔加深一下印象了. 关于人脸识别,首先需要了解的是级联分类器CascadeClassifier,它可以它既可以是Haar特征,也可以是LBP特征的分类器,可以加载OpenCV所提供的库当中的.xml文件,文件存放在anaconda\pkgs\libopencv-3.4.1-h875b8b8_3\Library\etc的haarcascades文件夹中,包含了许多个.

python使用opencv实现人脸识别系统

1.首先安装过python环境,在这里就不过说    检测是否安装成功如下,在cmd中输入Python     2.安装numpy 现在开始安装numpy,打开cmd,输入pip install numpy 我的电脑已经安装过了,忘记截屏了.就在网上找了图片 测试是否成功 3.安装opencv 在官网自行下载,这里下载的是opencv2.4.10安装. ### (1)复制cv2.pyd 将"\opencv\build\python\2.7\x64"或"\opencv\buil

基于 OpenCV 的人脸识别

基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 的多种现代技术,也支持如 iOS

基于QT和OpenCV的人脸识别系统

1 系统方案设计 1.1 引言 人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控.出入口控制.视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点. 本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用. 1.2 系统总体架构 "人脸识别&quo

用AndroidSDK中的FaceDetector实现人脸识别

用AndroidSDK中的FaceDetector实现人脸识别 功能分类:其他      支持平台:Android        运行环境:Eclipse 开发语言:Java      开发工具:Android        Studio源码大小:9.77MB 下载地址:http://sina.lt/zFh 源码简介 大家伙一想到要实现人脸识别,是不是第一反应就是第三方服务,哈哈,我也是这样子滴!其实在Android SDK从1.0版本中(API level 1)就已经集成了简单的人脸识别功能,

Python中利用Tesseract软件来识别图片中的英文与中文

OCR与Tesseract介绍   将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制. Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司).Tesseract 是目前公认最优秀.最精确的开源OCR 系统. 除了极高的精确度,Tesseract 也具有很高的灵活性.它

python之OpenCv(四)---人脸识别

对特定图像进行识别,最关键的是要有识别对象的特征文件.OpenCV已经内置了人脸识别特征文件,我们只要使用OpenCV的CascadeClassifier类即可进行识别. 语法: https://github.com/opencv/opencv.git 在这里可以下载特征文件,在data目录下 识别对象变量 = cv2.CascadeClassifier(特征文件).. 识别对象 识别结果变量 = 识别对象变量.detectMultiScale(图片,参数1,参数2,...) 参数有: 1.sc

python基于OpenCV的人脸识别系统

想获得所有的代码,请下载(来自我的CSDN): https://download.csdn.net/download/qq_40875849/11292912 主函数: from recognition import recognition from training import training from datasets import datasets from delFile import del_file def main(): facedict = {} cur_path = r'.

OpenCV摄像头人脸识别

注: 从外设摄像装置中获取图像帧,把每帧的图片与人脸特征进行匹配,用方框框住识别出来的人脸 需要用到的函数: CvHaarClassifierCascade* cvLoadHaarClassifierCascade( const char* directory, CvSize orig_window_size ); 第一个参数:训练好的级联分类器的路径 第二个参数:级联分类器训练中采用的检测目标的尺寸 #include "stdafx.h" #include "iostrea