python3 opencv3 实现基本的人脸检测、识别功能

2023-05-16

# encoding: utf-8
#老杨的猫,环境:PYCHARM,python3.6,opencv3

import cv2,os
import cv2.face as fc  #此处有坑,找不到脸,这样引用程序可以运行,欢迎大牛指点,CV2和CV3的结构区别没有搞清楚,应该怎么样引用才是正确的
import numpy as np
from PIL import Image, ImageDraw, ImageFont  #pip install pillow

#由于cv2.putText()不支持汉字,把图像里加入需要显示的文字,可以为汉字
def cvtopil(img,posion,txt):#图像数组,文字位置,文字内容
    pil_im = Image.fromarray(img)
    draw = ImageDraw.Draw(pil_im)
    font = ImageFont.truetype("simhei.ttf", 50, encoding="utf-8") # 第一个参数为字体文件路径,第二个为字体大小
    draw.text(posion, txt, (0, 0, 255), font=font)  # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体
    image=cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR) #把图像数组由RGB转为CV2处理的BGR格式
    return image  #返回处理后图像文件
#脸部图像采集模块。采集脸部图像,转为200*200的大小后,存到每个人对应的文件夹下
def dectface():
    #OPENCV3 自带的脸部检测XML文件
    #D:\Downloads...../haarcascade_frontalface_default.xml 文件所在路径为我的电脑里文件路径,检测脸部,可酌情修改
    face_cas=cv2.CascadeClassifier('D:\Downloads\opencv-3.3.1-vc14\opencv\sources\data\haarcascades/haarcascade_frontalface_default.xml')
    #检测眼睛,这里用不到
    eye_cas=cv2.CascadeClassifier('D:\Downloads\opencv-3.3.1-vc14\opencv\sources\data\haarcascades/haarcascade_eye.xml')
    cap=cv2.VideoCapture(0)#打开默认摄像头
    count=0 #初始化计数器,用来生成文件名,如0.pgm,1.pgm,3.pgm.....

    '''
    C:\Users\Administrator\.PyCharm2017.2\system\python_stubs\-1184660488\cv2\CascadeClassifier.py
连续读取摄像头图像,检测到脸部图像,把脸部图像以PGM的灰度格式格式保存在当前程序路径里的 jm1,jm2...文件夹下
采集要求:1光线适中,2脸部正直,3脸部图像大小以刚刚露出头发和下颌最佳,控制距离,太远采集图像精确度差,太近
没脸,4有效采集时间5秒左右就够用了,太多影响运行速度。
    '''
    while True:
        ret,frame=cap.read()#读取图像,RET为判断是否采集到图像,FRAME为采集到的一帧图像
        #此处最好判断是否采集到图像  if ret:do else:err  偷懒了
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #转为灰度图像,用来判断脸部用
        # 找脸,参数:图像文件,压缩率(越小检测迭代次数越多,越慢,越详细,此处图像大,1.3-1.5均可),矩形个数最小值,flags不知道,最小检测窗口大小,最大检测窗口大小。返回一个脸部区域,左上角为(0,0)坐标系,起始x,y点,w宽,h高
        faces = face_cas.detectMultiScale(gray, 1.3, 5)
        #用方框勾画出脸部位置
        for (x, y, w, h) in faces:
            img=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #画矩形,位置,大小,颜色,通道
            #cv2.putText(img,'abc',(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2) 不能显示汉字
            frame=cvtopil(img,(x,y-20),"老杨")#测试汉字用,可采集出图像是灰的,待解决
            f=cv2.resize(gray[y:y+h,x:x+w],(200,200)) #从灰度图中,扣出脸部,设置固定大小像素
            #保存到jm1里
            cv2.imwrite('F:\pytest\cvtest\detectface\jm1\ %s.pgm'%str(count),f)
            count+=1
            #眼睛检测
            # eyes=eye_cas.detectMultiScale(f,1.03,5,0,(40,40))
            # for (ex,ey,ew,eh) in eyes:
            #     cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,0,255),2)
        cv2.imshow("demo",frame) #显示图像
        # cv2.waitKey(0)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        # camera.release()
        # cv2.destroyAllWindows()


#读取样本文件,并加载到一个列表里,返回值包括2部分,[文件列表,对应标签],标签用来对照姓名用。
def read_img(path,sz=None):
    pr_img=[] #图像列表
    pr_flg=[] #对应标签
    pr_count=0 #初始化检测到的人数
    for dirname,dirnames,filenames in os.walk(path):#遍历当前程序目录我的图像文件保存在f:盘下
        #print(os.walk(path))
        #print(dirname,dirnames,filenames)
        for subdirname in dirnames: #遍历程序文件夹下的各个目录
            subject_path=os.path.join(dirname,subdirname)
            print(subject_path)
            for filename in os.listdir(subject_path): #遍历文件夹下文件
                print(filename)
                try:
                    filepath=os.path.join(subject_path,filename)
                    im=cv2.imread(filepath,cv2.IMREAD_GRAYSCALE) #读取JM文件下PGM文件
                    print(filepath)
                    #print(im.shape)
                    if im.shape!=(200,200): #判断像素是否200
                        im=cv2.resize(im,(200,200))
                    pr_img.append(np.asarray(im,dtype=np.uint8)) #添加图像
                    pr_flg.append(pr_count)#添加标签
                except:
                    print("io error")
            pr_count+=1 #另一个人的标签
    return [pr_img,pr_flg]

#学习样本,比对样本和实例,根据对应算法返回标签和系数,依据标签对照姓名,系数值提现了准确度。
def face_rec():
    names=['BAO BAO ','BA BA BA ','Bei Bei','MMMMMMM'] #标签对应的名字0,baobao,1,bbb,2,beibei....
    [x,y]=read_img("f:") #调读取函数,返回图像、和标签列表
    y=np.asarray(y,dtype=np.int32) #转为NUMPY的ARRAY

#CV自带的三种算法,现用LBPH算法。此处有坑,坑的我差点放弃,原来叫createLBPHFaceRecognizer,为什么我下载的这模样
    #model=fc.EigenFaceRecognizer_create()
    #model = fc.FisherFaceRecognizer_create()
    model = fc.LBPHFaceRecognizer_create()

    # 训练,此处应把训练结果保存,再用到时直接读取结果,效率更高,xml?json?pickle?
    model.train(np.asarray(x),np.asarray(y))

    #下面读取摄像头图像,用矩形标识检测到脸部和训练后结果比对,打印出对应标签所对应名字
    camera=cv2.VideoCapture(0)
    face_cascade=cv2.CascadeClassifier('D:\Downloads\opencv-3.3.1-vc14\opencv\sources\data\haarcascades/haarcascade_frontalface_default.xml')
    while True:
        read,img=camera.read()
        faces=face_cascade.detectMultiScale(img,1.3,5)
        for (x,y,w,h) in faces:
            img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
            gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
            roi=gray[x:x+w,y:y+h]
            try:
                roi=cv2.resize(roi,(200,200),interpolation=cv2.INTER_LINEAR)

                params=model.predict(roi) #predict()函数做比对,返回一个元祖格式值 (标签,系数)。系数和算法有关,
                # 前2种算法值低于5000不可靠,LBPH低于50可靠,80-90不可靠,高于90纯蒙
                #此处有文章可做,通过单位时间内检测到的系数平均值,可以得到更准确结果
                print(params)
                #打印标签对应名字,如cvtopil的灰度问题解决,可cvtopil函数替换
                cv2.putText(img,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
            except:
                continue
        cv2.imshow("abc",img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
if __name__=='__main__':
    '''
    1.先用dectface()采集样本,注释掉face_rec(),将采集样本保存到jm文件夹里,现在每次采集不同人样本,需要手动建立JM1,JM2.....以后应完善程序流程为,首先判断是否有此人样本,如没有自动建立文件夹并保存该人的样本。
    2.采集完成后,注释dectface(),用face_rec()通过比对得到是谁的结果。
    3.names=['BAO BAO ','BBBBBBB','Bei Bei','MMMMMMM'] 名字和对应标签应该存成文件,对应读取
    3.真心不会用类啊。。。咋用类实现整个流程呢??
        4.从学PYTHON到现在也不过一个月时间,基础很不牢,cv2,CV3从引用到使用的区别搞不清楚呢,恳求大牛各种批评指导啊!!
    '''
    #dectface()
    face_rec()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 opencv3 实现基本的人脸检测、识别功能 的相关文章

  • JSTL学习笔记

    xff08 1 xff09 概念 xff1a JavaServer Pages Tag Library jsp标准标签库 xff08 2 xff09 作用 xff1a 用于简化和替换jsp页面上的Java代码 xff08 3 xff09 使
  • idea 开启 tomcat 热部署 的 具体流程 和 使用方式

    idea 开启 tomcat 热部署 的 具体流程 和 使用方式 https www cnblogs com c2g5201314 p 12275243 html https blog csdn net qq 41288095 articl
  • java 判断字符串是否为空

    四种判断为空表示方式 xff1a 1 str 61 61 null 2 34 34 equals str 3 str length 61 61 0 4 str isEmpty 1234 代码中的四种不为空的运用 xff1a if str 6
  • springmvc返回值

    xff08 1 xff09 返回字符串 xff08 2 xff09 void xff08 3 xff09 返回ModelAndView 把user对象存储到mv对象中 xff0c 也会把user对象存入到request对象 mv addOb
  • springmvc上传下载

    xff08 1 xff09 form表单的enctype取值是 xff1a multipart form data xff0c method取值是 xff1a post xff0c 提供一个文件选择域 xff08 2 xff09 sprin
  • 数据库多表和范式

    xff08 1 xff09 一对多的关系 xff1a 一个部门可以有多个员工 xff0c 一个员工只能属于一个部门 在多的一方建立外键 xff0c 指向1的一方的主键 xff08 2 xff09 多对多关系 课程 学生 中间表 xff0c
  • springjdbc学习笔记

    xff08 1 xff09 导包 xff08 2 xff09 创建jdbcTemplate xff0c 依赖数据源DataSource 实例化的时候需要传入DataSource jdbcTemplate 61 new JdbcTemplat
  • MySQL多表操作

    xff08 1 xff09 笛卡尔积 xff1a 两个集合的所有组合 xff1a select from 表1 xff0c 表2 xff08 2 xff09 内连接查询 xff1a 隐式内连接 xff1a select from 表1 xf
  • MySQL事务

    xff08 1 xff09 概念 xff1a 一个包含多个步骤业务操作 xff0c 被事务管理 xff0c 这些操作具有统一性 xff08 要么成功 xff0c 要么失败 xff09 操作开启事务 xff08 start transacti
  • 软件产品化

    1 产品化定义 xff1a 软件产品化是指客户无需为软件添加或调整代码和语句即能完成软件的安装配置 应用初始化 系统管理 用户使用的全过程 xff0c 并且软件至少能满足80 以上的用户某一组应用需求 微软Office或杀毒软件就是产品化软
  • MySQL忘记root密码

    1 cmd gt net stop mysql 停止mysql服务 需要管理员运行该cmd 2 使用无验证方式启动mysql服务 xff1a mysqld skip grant tables 3 打开新的cmd窗口 直接输入mysql命令
  • 对象转型

    一 对象转型介绍 对象转型分为两种 xff1a 一种叫向上转型 父类对象的引用或者叫基类对象的引用指向子类对象 xff0c 这就是向上转型 xff0c 另一种叫向下转型 转型的意思是 xff1a 如把float类型转成int类型 xff0c
  • 获取文件的真实(服务器)路径

  • jQuery选择器

    1 基本选择器 标签选择器 xff08 元素选择器 xff09 xff0c 语法 xff1a 34 html标签名 34 id选择器 xff0c 语法 xff1a 34 id的属性值 34 类选择器 xff0c 语法 xff1a 34 cl
  • MySQL8:Unknown initial character set index ‘255‘ received from server. Initial client character 解决方法

    Unknown initial character set index 39 255 39 received from server Initial client character set can be forced via the 39
  • mybatis延迟加载

    1 什么是延迟加载 在使用时候才加载数据 xff0c 不用的时候不加载 2 关联对象是1时 xff0c 采用立即加载 xff1b 关联对象是多是 xff0c 采用延迟加载 3 一对一 xff08 一对多 xff09 延迟加载步骤及配置 xf
  • springmvc拦截器

    一 springmvc拦截器只有springmvc有 xff0c Servlet的拦截器可以适用任何web项目 二 步骤 1 编写拦截器类 xff0c 实现 HandlerInterceptor 接口 xff1b 配置拦截器 2 案例 pu
  • SSM整合

    一 spring整合springmvc mybatis 二 配置文件 43 注解 1 创建相应的类 xff1a dao controller domain service service impl 2 首先配置spring xff0c 使用
  • Maven 骨架创建 Java Web 项目

    Maven 骨架创建 Java Web 项目 1 File gt New gt Project 2 如下图 3 xff09 如下图 GroupId和ArtifactId lt 项目名 gt 还有Version xff0c 这三个属性目的是标
  • IntelliJ IDEA集成maven

    一 idea中maven的配置 1 maven配置 首先需要在idea中对maven进行集成 xff0c 目录为File Setting Build Execution Deployment Build Tools maven xff0c

随机推荐

  • 批量替换tab为空格

    利用find 找出需要替换的文件 xff0c 然后使用sed命令执行替换 如将src 路径下的所有cpp 文件的tab 替换为空格的命令如下 sed span class hljs attribute i span span class h
  • idea工具集成配置maven最详细的

    IDEA 全称 IntelliJ IDEA xff0c 是java语言开发的集成环境 xff0c IntelliJ在业界被公认为最好的Java开发工具之一 IDEA是JetBrains公司的产品 现在有逐步取代老牌Java开发工具Eclip
  • Maven的安装与配置

    一 安装本地Maven tips 官网为外网 xff0c 下载速度较慢 xff0c 这里提供3 6 3版本的三方链接下载Maven下载 无视下载速度以及需要其他版本的伙伴点此进入Maven官网下载 选择左侧Download 点击箭头所指的链
  • Maven骨架

    Maven骨架 Maven骨架简单的来说就是一种模型 结构 xff0c Maven根据我们的不同的项目和需求 xff0c 提供了不同的模型 xff0c 这样就不需要我们自己建模型了 举个简单的例子 xff1a 就比如我们要做一套普通的楼房
  • 实现分页功能

    可以先看这个 xff08 1 xff09 https www baidu com link url 61 1O13jXHEC3F2wEP5jCw0KQZCsjW4S7LFdruGJxbJO7G8dkAFgLA2sNKe48F5vOjmP8G
  • jsp中select数据回显

    xff08 1 xff09 https blog csdn net qq 23190729 article details 76774801 utm medium 61 distribute pc relevant none task bl
  • 简单的jsp插入多条数据

    lt 64 page import 61 34 java sql Connection 34 gt lt 64 page import 61 34 java sql Statement 34 gt lt 64 page import 61
  • Servlet数据库连接池

    使用连接池连接数据库 首先在一下apache中的conf文件夹中的context xml文件添加下面这段配置信息 lt Resource name 61 34 jdbc message 34 auth 61 34 Container 34
  • 数据库连接池在TOMCAT中的几种配置方法

    https www cnblogs com jay36 p 7684000 html 还有 C3P0数据库连接池 阿里druid数据库连接池 https www cnblogs com fxbin p 11854367 html https
  • 在idea中的过滤器

    https blog csdn net u010835486 article details 80730745 案例 xff1a https www bilibili com video av543581547
  • Session

    概念 https www runoob com jsp jsp session html 使用 https www cnblogs com bhlsheji p 4015568 html 登录案例 https blog csdn net q
  • E: package ‘gcc‘ has no installation candidate

    E package gcc has no installation candidate 问题描述 第一次使用gcc编译c语言代码时出现command gcc not found but can be installed with sudo
  • ANOMALY: use of REX.w is meaningless (default operand size is 64)

    1 针对所有程序 注册表中增加项 计算机 HKEY LOCAL MACHINE SOFTWARE TEC Ocular 3 agent config 下 新建 字符串值 hookapi disins 数值数据 1 2 针对特定程序 注册表中
  • google启动错误

  • 安装dlib前需要先安装cmake 和boost。然后才能正确安装dlib

    pip install boost pip install cmake pip install dib
  • anconda国内镜像源

    1 为conda配置 xff08 清华 xff09 镜像源 使用conda进行安装时 xff0c 访问的是国外的网络 xff0c 所以下载和安装包时会特别慢 我们需要更换到国内镜像源地址 xff0c 这里我更换到国内的清华大学地址 xff0
  • Anaconda常用命令大全

    使用conda 首先我们将要确认你已经安装好了conda 配置环境 下一步我们将通过创建几个环境来展示conda的环境管理功能 使你更加轻松的了解关于环境的一切 我们将学习如何确认你在哪个环境中 xff0c 以及如何做复制一个环境作为备份
  • openCV错误模块‘cv2.face‘没有属性‘createEigenFaceRecognizer‘(openCV Error module 'cv2.face' has no at

    pip uninstall opencv contrib python pip install opencv contrib python no cache dir 功能也更改为此 load被替换为read import cv2 recog
  • Python enumerate() 函数

    enumerate 函数用于将一个可遍历的数据对象 如列表 元组或字符串 组合为一个索引序列 xff0c 同时列出数据和数据下标 xff0c 一般用在 for 循环当中 Python 2 3 以上版本可用 xff0c 2 6 添加 star
  • python3 opencv3 实现基本的人脸检测、识别功能

    encoding utf 8 老杨的猫 环境 PYCHARM xff0c python3 6 opencv3 import cv2 os import cv2 face as fc 此处有坑 找不到脸 这样引用程序可以运行 xff0c 欢迎