Python 使用Opencv实现人脸识别
----------欢迎加入学习交流QQ群:657341423
要实现人面识别,首先安装opencv的opencv_contrib组件。首先在https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv下载相关组件。
在CMD窗口下先卸载原有的opencv,然后安装opencv_contrib的安装包。
pip uninstall opencv_python-3.4.1-cp35-cp35m-win_amd64.whl
pip install opencv_python-3.4.1+contrib-cp35-cp35m-win_amd64.whl
完成上述安装后,接着实现人面识别,首先装备人面资料,如图所示:
文件夹alin和xyjw是分别存放人物头像图片,分别代表人物alin和xyjw,图片格式为pgm格式。
由于一开始是没有人物头像图片,于是,我们先用人面检测获取人物头像图片,代码如下:
import cv2
def get_face_data():# 加载Haar级联数据文件,用于检测人面face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')camera = cv2.VideoCapture(0)count = 1while True:ret, frame = camera.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人面识别。detectMultiScale参数说明:# gray: 进行检测的图像, 这里是转换后的。# scaleFactor: 官网文档说是每次图片缩小的比例, 其实可以这么理解, 距离相机不同的距离, 物体大小是不一样的, 在物体大小不一致的情况下识别一个东西是不方便的, 这就需要进行多次的缩放, 这就是这个参数的作用。# minNeighbors: 可以理解为每次检测时, 对检测点(Scale)周边多少有效点同时检测, 因为可能选取的检测点大小不足而导致遗漏。# minSize: 检测点的最小值, 或者说就是检测点的最终值。faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(5,5))# 画出面部位置for (x, y, w, h) in faces:img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)# 根据检查的位置截取图片并调整截取后的图片大小f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))# 保存图片cv2.imwrite('auto/alin/%s.pgm' %(str(count)),f)count += 1cv2.imshow('pic', frame)# 停止程序if cv2.waitKey(120) & 0xff == ord('q'):breakcamera.release()cv2.destroyAllWindows()if __name__=='__main__':get_face_data()
人面图片的数据获取后,我们利用这些数据实现人面识别,其功能代码如下:
import sys,os,cv2
import numpy as np
# 加载面部资料
def read_images(path, sz=None):"""Reads the images in a given folder, resizes images on the fly if size is given.Args:path: 人面数据所在的文件路径sz: 图片尺寸设置Returns:A list [X,y]X: 图片信息y: 图片的读取顺序"""c = 0X,y = [], []for dirname, dirnames, filenames in os.walk(path):for subdirname in dirnames:subject_path = os.path.join(dirname, subdirname)for filename in os.listdir(subject_path):filepath = os.path.join(subject_path, filename)im = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)if (sz is not None):im = cv2.resize(im, sz)X.append(np.asarray(im, dtype=np.uint8))y.append(c)c = c+1return [X,y]# 面部识别
def face_rec():names = ['Alin', 'XyJw', 'Jack'][X, y] = read_images('E:\\auto\\')# 创建识别模型,使用EigenFace算法识别,Confidence评分低于4000是可靠# model = cv2.face.EigenFaceRecognizer_create()# 创建识别模型,使用LBPHFace算法识别,Confidence评分低于50是可靠# model = cv2.face.LBPHFaceRecognizer_create()# 创建识别模型,使用FisherFace算法识别,Confidence评分低于4000是可靠model = cv2.face.FisherFaceRecognizer_create()# 训练模型# train函数参数:images, labels,两参数必须为np.array格式,而且labels的值必须为整型model.train(np.array(X), np.array(y))# 开启摄像头camera = cv2.VideoCapture(0)# 加载Haar级联数据文件,用于检测人面face_cascade = cv2.CascadeClassifier('cascades/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]# 将检测的人面缩放200*200大小,用于识别# cv2.INTER_LINEAR是图片变换方式,其余变换方式如下:# INTER_NN - 最近邻插值。# INTER_LINEAR - 双线性插值(缺省使用)# INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。# INTER_CUBIC - 立方插值。roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)# 检测的人面与模型进行匹配识别params = model.predict(roi)print("Label: %s, Confidence: %.2f" % (params[0], params[1]))# 将识别结果显示在摄像头上# cv2.FONT_HERSHEY_SIMPLEX 定义字体# cv2.putText参数含义:图像,文字内容, 坐标 ,字体,大小,颜色,字体厚度# 如果要输出中文字,可参考https://blog.csdn.net/m0_37606112/article/details/78511381cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)cv2.imshow("camera", img)if cv2.waitKey(120) & 0xff == ord("q"):breakcv2.destroyAllWindows()if __name__ == "__main__":face_rec()
函数read_images是分别读取文件夹alin和xyjw的图片数据和文件夹读取顺序。文件夹读取顺序是先读取alin的图片数据,然后在读取xyjw的图片数据,最后将两者的图片数据写入列表,因此这里存在一个先后顺序问题。
函数face_rec是调用函数read_images,因此函数read_images的返回值与变量names的值要一一对应,比如函数read_images的返回值第一个人面数据是alin,变量names的第一个值为alin。否则对应不上就会将名字写错。
人面识别也是通过摄像头来获取人物头像,然后根据算法与文件夹alin和xyjw的头像进行匹配对比。匹配成功会返回Label和Confidence,其中Label代表资料加载顺序,即函数read_images读取文件夹alin和xyjw的读取顺序。Confidence是识别评分,每种算法有一定的范围值,符合范围值才算匹配成功。
参考资料:OpenCV 3计算机视觉 Python语言实现第二版
Python 使用Opencv实现人脸识别相关推荐
- python使用opencv实现人脸识别系统
1.首先安装过python环境,在这里就不过说 检测是否安装成功如下,在cmd中输入Python 2.安装numpy 现在开始安装numpy,打开cmd,输入pip install nu ...
- Python基于OpenCV的人脸识别自助商店(源码&部署视频)
1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...
- 基于python和opencv的人脸识别
该图像识别需要安装opencv,opencv的安装方法有两种,可通过网上提示的进行安装,本人是由pycharm里面直接安装的. 也可以直接根据python的版本通过cmd命令进行安装其命令为pip i ...
- 使用python和opencv进行人脸识别时遇到cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-buil
在使用 python-opencv进行人脸识别时可能会遇到下面的错误: Traceback (most recent call last):File "E:/python/test/test ...
- python人脸识别教程_50行Python代码+OpenCV实现人脸识别!史上最详细的教程!
环境拓扑: 操作系统:windows7 python版本:2.7.14 opencv版本:3.x 环境配置: 1.安装python(额...这个当我没说) 2.安装Opencv 这个从官网下载就OK啦 ...
- python人脸识别opencv_用python和opencv 做人脸识别
网上找的代码,运行之后,发现没有描述的功能.test1窗口打开之后,并不能识别人脸.本人初学,希望大家不吝赐教,在此谢过 import cv2 import numpy as np cv2.named ...
- 基于OpenCV的人脸识别自助商店(源码&部署视频)
1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...
- Python基于OpenCV的人脸表情识别系统[源码&部署教程]
1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...
- python opencv生成tf模型_基于TensorFlow+ Opencv 的人脸识别 和模型训练
一.准备工作 本次实例的anaconda 环境 (有需要的自己导入anaconda) 链接:https://pan.baidu.com/s/1IVt2ap-NYdg64uHSh-viaA 提取码:g7 ...
最新文章
- Linux学习总结(七十)docker-2
- 《Windows驱动开发技术详解》之编程加载NT式驱动
- MySQL5.6 更改字段属性仍旧会锁全表,注意这个坑!
- [react] 在React中怎么引用sass或less?
- Activiti工作流框架学习(一)环境的搭建和数据表的了解
- TensorFlow 教程 --教程--2.6卷积神经网络
- tomcat start 无法启动_解密Springboot内嵌Tomcat
- SOA webservice
- itext pdf合并
- ArcGIS Engine基础(7)之栅格数据集常用操作
- 1116: 删除元素(数组)
- oracle统计日均,oracle效率优化实战——计算3个月的平均值
- ubuntu 设置打开文件的默认方式
- 【特征工程概要】解释什么是特征,特征工程的步骤
- [CH5202]自然数拆分Lunatic版
- 计算机专业课程体系介绍(含学习顺序)
- android webview全屏显示html内容
- Raft论文解读对话
- django中bulk_create返回id的三种实现
- “当你不再是程序员,很多事会脱离掌控”—— 对话全球最大独立开源公司SUSE CTO...
热门文章
- 辅警考试计算机应用知识,2019年辅警考试题库:计算机知识习题(五)
- c语言编写日历作业,C实例编程(用C语言编写的一个日历文件)
- 辩驳一个默认的说法:IE6不支持!important (转http://www.cnblogs.com/lanyueer/archive/2011/03/29/1998398.html)
- LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping.md
- 封装Ajax--解决地狱回调问题
- decode函数吗 jsp_SQL优化 ----- 使用 DECODE 函数来减少处理时间
- spring cloud OAuth2
- Unity下载方法(超详细)
- java:synchronized 锁的原理
- Java 类加载机制