先来普及一下概念, 计算机对人脸是如何识别的呢? 或者说图像是如何识别的。主要是获取单张图片的特征值记录了特征值以后,如果下一张图片来了以后两张图片特征值进行对比,如果相似度很高那么计算机就认定这两个是一类图(当然这是需要算法来实现的)

我写的这个是怎么实现的呢,一组训练集训练要识别的人的图像来进行特征提取保存到模型中,在通过摄像头返回的图像进行处理并最后展现出来

直接上代码:   ---- 抱歉由于不知道插入代码后怎么写文字我就全写这了。代码不算完善,但是识别没问题   使用时修改   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 进行人脸识别,视频追踪代码全注释的更多相关文章

  1. 万张PubFig人脸数据实现基于python+OpenCV的人脸特征定位程序(1)

    在最近刷今日头条以及其他媒体软件时,经常会发现一些AI换脸的视频,于是我想,可不可以自己实现一个可以进行人脸识别的软件程序.我的具体流程是先配合python网络爬虫先进行万张PubFig人脸公共图片的 ...

  2. 基于Python的开源人脸识别库:离线识别率高达99.38%

    项目地址:https://github.com/ageitgey/face_recognition#face-recognition 本文的模型使用了C++工具箱dlib基于深度学习的最新人脸识别方法 ...

  3. 关于opencv中人脸识别主函数的部分注释详解。

    近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...

  4. 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程

    注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...

  5. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  6. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  7. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  8. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  9. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

随机推荐

  1. 洛谷 P1607 [USACO09FEB]庙会班车Fair Shuttle 解题报告

    P1607 [USACO09FEB]庙会班车Fair Shuttle 题目描述 Although Farmer John has no problems walking around the fair ...

  2. bzoj进度条

    好久没发进度了 这个月没有上个月那么猛,肯能使因为这个月不想水题吧 No. 510 Solved Problems List Solved 368 10001001100210071008101210 ...

  3. CodeIgniter自带的数据库类使用介绍

    在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 依据你的数据库配置载入并初始化数据库类: view source ...

  4. 如何使用Navicat备份数据库脚本

    Navicat是一个实用的工具,可以用来备份数据库(Oracle.MySQL.SQLServer)脚本. 备份步骤如下: 1.打开已建立的数据库连接,鼠标右键点击,选择[转储SQL文件]->[结 ...

  5. composer应用

    ubentu安装 进入自己的项目根目录cd/path/to/my/project 下载composer curl -s http://getcomposer.org/installer 把这个文件移到 ...

  6. POJ1087:A Plug for UNIX(最大流)

    A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...

  7. activity栈清空

    http://blog.csdn.net/swjtuxu/article/details/26163737

  8. html中音频和视频

    HTML5音频中的新元素标签 src:音频文件路径. autobuffer:设置是否在页面加载时自动缓冲音频. autoplay:设置音频是否自动播放. loop:设置音频是否要循环播放. contr ...

  9. 通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题

    通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题:用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_si ...

  10. Python 进阶学习笔记

    把函数作为参数 import math def add(x, y, f): return f(x) + f(y) print add(, , math.sqrt) map(f, list) 函数 接收 ...