基于 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 ...
随机推荐
- BZOJ day2
十六题...(好难啊) 1051105910881191119214321876195119682242243824562463276128184720
- git使用笔记(四)远程操作
By francis_hao Nov 19,2016 以一张图说明远程操作,图片来自参考[2] git clone 从远端主机克隆一个版本库,若省略directory则生成一个和远端同名的版本库 ...
- POJ1511:Invitation Cards(最短路)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 34743 Accepted: 114 ...
- QT QLayout 清空
QLayout* pLayout = (QLayout*)ui->frame->layout(); )) { QWidget* pWidget = child->widget(); ...
- AWS nat monitor and route switch script
This script will monitor another NAT instance and take over its routes if communication with the oth ...
- es6+最佳入门实践(8)
8.Promise 8.1.什么是异步? 要理解异步,首先,从同步代码开始说 alert(1) alert(2) 像上面的代码,执行顺序是从上到下,先后弹出1和2,这种代码叫做同步代码 alert(0 ...
- Html 让文字显示在图片的上面
如题: 第一种方式便是将 image 作为背景图片,即:background-image:url("......."); 在此可以控制背景图片的横向和纵向的平铺: backgrou ...
- mysql 基本操作练习
), sex ), age )); , '北京'); , '上海'); , '广州'); , '北京'); , '北京'); , '上海'); , '北京'); #(). 写出sql语句,查询所有年龄 ...
- 【STSRM12】整除
[题意]给定长度为n的序列A,求最长的区间满足区间内存在数字能整除区间所有数字,同时求所有方案.n<=5*10^5,Ai<2^31. [算法]数论??? [题解]首先一个区间的基准数一定是 ...
- bzoj 1996 DP
我们可以发现,对于最后队列的一段区间[i,j],不论这一段区间如何插入,除了最后一个插入的对象外,剩下的对后续插入没有影响,这启发我们可以用DP来解决这一问题. w[i][j][0..1]代表区间[i ...