基于 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 ...
随机推荐
- BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4281 Solved: 1644 [Submit][St ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- LinuxUnix time时间戳的处理转换函数
Linux/Unix time时间戳的处理转换函数 linux下的时间函数 我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年.月.日.时.分.秒,星期等),或者是隔一段时间去做某事,那 ...
- jsp电子商务 购物车实现之一 设计篇
购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: 2.用session实现购物车: 3.用cookie和数据库(购物车信息持久化)实现购物车: ============= ...
- BZOJ_day9
哇,一道巨大的水题害得我wa了无数次... 总结一下教训 大家一定记住(给我自己看的) 位运算 一定要加()!!! 重要的事情说三遍 位运算 一定要加()!!! 位运算 一定要加()!!! 位运算 ...
- SQLyog 使用笔记,自增主键数据冲突错误
select max(id) from test ; desc test ; insert into test (a,b,c) values ('abc','123-213','test'); RE ...
- windows主机控制
一.开关机控制 using System.Runtime.InteropServices; //注销.关机.重启 class shutdown { [StructLayout(LayoutKind.S ...
- 【Atcoder】ARC 080 E - Young Maids
[算法]数学+堆 [题意]给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序. [题解] 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前 ...
- DotNet 学习笔记 MVC模型
Model Binding Below is a list of model binding attributes: •[BindRequired]: This attribute adds a mo ...
- 在ubuntu 上面安装ubuntu touch 模拟器
Canonical 公司已经发布了一个运行着Unity8和Mir的Ubuntu Touch模拟器.虽然有一些bug,例如在64位的系统上会使系统崩溃,但我们相信这些都会被一 一修复,这篇文章将教大家如 ...