基于 Python + OpenCV 进行人脸识别,视频追踪代码全注释
先来普及一下概念, 计算机对人脸是如何识别的呢? 或者说图像是如何识别的。主要是获取单张图片的特征值记录了特征值以后,如果下一张图片来了以后两张图片特征值进行对比,如果相似度很高那么计算机就认定这两个是一类图(当然这是需要算法来实现的)
我写的这个是怎么实现的呢,一组训练集训练要识别的人的图像来进行特征提取保存到模型中,在通过摄像头返回的图像进行处理并最后展现出来
直接上代码: ---- 抱歉由于不知道插入代码后怎么写文字我就全写这了。代码不算完善,但是识别没问题 使用时修改 train_path 和 fd 的人脸描述.xml文件路径就ok了
训练文件结构描述 : train_path文件结构 train_path -> LL(老李) -> 所有人脸图片
face.xml 文件下载地址 : http://note.youdao.com/noteshare?id=a74c5cffa145ff5341560d6c269702cb&sub=6A602009232C468CBE83114E840D679E
# 抱歉由于本人不会用 github 所以大家用有道云下载吧(捂脸笑)
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# 操作文件
import os
# 科学计算
import numpy as np
# 图像识别
import cv2 as cv
# 数据预处理, 该项目中只使用了标签编码
import sklearn.preprocessing as sp def load_imgs(directory):
'''加载 directory 该文件夹下所有以 .jpg 结尾的图片'''
# 识别 系统环境 自动分配当前系统的路径分隔符并替换
directory = os.path.normpath(directory)
# 判断当前路径是否为存在
if not os.path.isdir(directory):
# 手动抛出异常 biu biu biu
raise IOError("The directory '" + directory + "' doesn't exist!")
# 创建图片集合 用于存储文件夹名和该文件夹下所有的图片
faces = {}
# os.walk(directory) 获取当前文件夹下所有的文件夹以及文件
# curdir: 当前文件夹路径
# subdirs: 当前文件夹下所有文件夹 (列表)
# files: 当前文件夹下所有文件 (列表)
for curdir, subdirs, files in os.walk(directory):
# 首先便利所有的文件 筛选.jpg结尾文件并循环
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]
# 判断当前key值是否存在图片集合中, 如果为空则创建该键并赋值空列表
# 否则给图片集合中的 key 添加图片路径
if label not in faces:
faces[label] = []
faces[label].append(path)
# 返回图片集合
return faces def LBPHModel(fd, codec, train_path):
'''
-------------------
参数说明: fd, codec, [model_path]
fd: Haar-like(人脸特征模型对象)
codec: LabelEncoder(标签编码器对象)
model_path: 服用模型路径(功能未实现, 没找到读取的函数...)
-------------------
返回: 训练后的模型对象
'''
# 加载当前文件加下所有.jpg结尾的图片
train_faces = load_imgs(train_path) # 'traom_imgs'
# 将所有标签放入编码器进行训练
codec.fit(list(train_faces.keys()))
# 创建空的训练集数组x y
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)
# 创建LBPH人脸检测器
model = cv.face.LBPHFaceRecognizer_create()
# 对训练集进行训练
model.train(train_x, train_y)
return model if __name__ == "__main__":
# 训练集图片存储路径
train_path = 'train_imgs'
# 读取人脸描述文件, 构建人脸检测器
fd = cv.CascadeClassifier('face.xml')
# 创建标签编码器
codec = sp.LabelEncoder()
# 获取model
model = LBPHModel(fd, codec, train_path)
# 打开视频捕捉设备
vc = cv.VideoCapture(0)
while True:
# 读取视频帧
frame = vc.read()[1]
# 反转图片
frame = cv.flip(frame, 1)
# print(frame)
# 人脸位置检测, 返回数组
faces = fd.detectMultiScale(frame, 1.3, 5)
# 循环人脸位置数组
for l, t, w, h in faces:
# 给人脸描边
cv.rectangle(frame, (l, t), (l + w, t + h),
(255, 0, 0), 4)
# 复制原图片文本
gray = frame.copy()
# 将图片变化成灰度图
gray = cv.cvtColor(gray, cv.COLOR_BGR2GRAY)
# 对面部特征进行识别
pred_test_y = model.predict(gray[t:t + h, l:l + w])[0]
# 将预测后的结果进行标签解码
face_name = codec.inverse_transform([pred_test_y])[0]
# 给图片添加文本 图片矩阵, 添加文本名称, 设置文本显示位置,
# 字体样式, 字体大小, 字体颜色, 字体粗细
cv.putText(frame, face_name, (l + 5, t - 15),
cv.FONT_HERSHEY_SIMPLEX, 1,
(255, 255, 255), 3)
# 打印名称
# print(face_name) # 显示图片
cv.imshow('VideoCapture', frame)
# 等待按下ESC键退出, 每次等待33毫秒
if cv.waitKey(33) == 27:
break
# 关闭视频捕捉设备
vc.release()
# 关闭视频窗口
cv.destroyAllWindows()
基于 Python + OpenCV 进行人脸识别,视频追踪代码全注释的更多相关文章
- 万张PubFig人脸数据实现基于python+OpenCV的人脸特征定位程序(1)
在最近刷今日头条以及其他媒体软件时,经常会发现一些AI换脸的视频,于是我想,可不可以自己实现一个可以进行人脸识别的软件程序.我的具体流程是先配合python网络爬虫先进行万张PubFig人脸公共图片的 ...
- 基于Python的开源人脸识别库:离线识别率高达99.38%
项目地址:https://github.com/ageitgey/face_recognition#face-recognition 本文的模型使用了C++工具箱dlib基于深度学习的最新人脸识别方法 ...
- 关于opencv中人脸识别主函数的部分注释详解。
近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...
- 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程
注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...
- 基于 OpenCV 的人脸识别
基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...
- 【计算机视觉】基于OpenCV的人脸识别
一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...
- 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
随机推荐
- LowercaseRoutesMVC ASP.NET MVC routes to lowercase URLs
About this Project Tired of your MVC application generating mixed-case URLs like http://mysite.com/H ...
- 安卓topbar编码实战
1.先在res->value下新建attrs.xml文件 <?xml version="1.0" encoding="utf-8"?> < ...
- oracle获取主机服务器IP
--要获取服务器端的IP :: SYS@XXX> select utl_inaddr.get_host_address from dual; GET_HOST_ADDRESS --------- ...
- linux 学习好资源
Linux-Wiki.cn http://linux-wiki.cn/wiki/zh-hans/Linux%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84 Linux目录 ...
- C# 序列化理解 1(转)
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种串行化的方式: ...
- nginx重要配置项简要说明
1.重要配置项 以下是一个完整的nginx配置信息. #================================以下是全局配置项 #指定运行nginx的用户和用户组,默认情况下该选项关闭(关闭 ...
- jupyter、flask、tornado、djiango安装
安装了pip包的话直接使用: 1.安装jupyter:pip install jupyter 2.安装flask: pip install flask 3.安装tornado:pip install ...
- bzoj 1880 最短路
我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...
- alt+ F8 设置无效(转)
原文转自 https://blog.csdn.net/m372897500/article/details/7310251 具体修改方法如下: 工具-选项-环境-键盘-应用以下其他键盘映射方案,选择v ...
- [Leetcode Week10]01 Matrix
01 Matrix 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/01-matrix/description/ Description Given a ...