Opencv的人脸检测函数,定义了具体可跟踪对象类型的数据文件。

Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配。

两个图像的相似程度可以通过它们对应特征的欧式距离来度量。距离可能以空间坐标或颜色坐标来定义。类Haar特征是一种用于实现实时人脸跟踪的特征。每个类Haar特征都描述了相邻图像区域的对比模式。例如,边,顶点和细线都能生成具有判断性的特征。

Haar级联级具有尺度不变性,换句话说,它在尺度变化上具有鲁棒性。但是,opencv的Haar级联不具有旋转不变性。

在opencv源代码的副本中会有一个文件夹data/haarcascades,该文件夹包括了所有opencv的人脸检测的xml文件,这些文件可用于检测静止图像,视频和摄像头所得到图像中的人脸。

在开始写代码之前,先要下载opencv源代码包:

静态图像中的人脸检测:

import cv2 as cvfilename = 'D:/timg.jpg'face_cascade = cv.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
//注意用绝对路径就不会报错
img = cv.imread(filename)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:img = cv.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)cv.namedWindow('Vikings Detected')
cv.imshow('Vikings Detected', img)
cv.waitKey(0)

图片检测人脸只是开胃菜,真正让我感兴趣的是视频或摄像头下的人脸识别,废话少说:

当然第一步是先学会视频中人脸检测,代码如下:

import numpy as np
import cv2face_cascade = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
while True:ret,img = cap.read()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow('img',img)       if cv2.waitKey(1) &0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()

效果就自己尝试吧。

接下来开始人脸识别了:

1.生成人脸识别数据,代码如下:

import cv2
import osdef generate(dirname):face_cascade = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')eye_cascade = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_eye.xml')//带眼镜的时候可以用下面这个//eye_cascade = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')//创建目录if(not os.path.isdir(dirname)):os.makedirs(dirname) //打开摄像头进行人脸图像采集camera = cv2.VideoCapture(0)count = 0while (True):ret, frame = camera.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x,y,w,h) in faces:img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)//重设置图像尺寸 200*200f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))cv2.imwrite(dirname+'/%s.pgm' % str(count), f)print(count)count += 1cv2.imshow("camera", frame)if cv2.waitKey(100) & 0xff == ord("q"):break//下面是你想要多少张图片就停止elif count > 20:breakcamera.release()cv2.destroyAllWindows()if __name__ == "__main__":generate("D:/data/lijiale") //你生成的图片放在的电脑中的地方

这是我运行上面代码的结果:

2.有了人脸数据后,接下来的是基于Eigenfaces的人脸识别,代码如下:

import cv2,os,sys
import numpy as npdef read_images(path, sz = None):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):try:if not filename.endswith('.pgm'):continuefilepath = os.path.join(subject_path, filename)im = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)if sz is not None:im = cv2.resize(im,(200,200))X.append(np.asarray(im, dtype=np.uint8))y.append(c)except:print("Unexpected error:",sys.exc_info()[0])c = c + 1return [X, y]def face_rec(img_path):names = ['lijiale'][X,y] = read_images(img_path)y = np.asarray(y, dtype=np.int32)model = cv2.face.EigenFaceRecognizer_create()model.train(np.asarray(X), np.asarray(y))camera = cv2.VideoCapture(0)face_cascade = cv2.CascadeClassifier(r'D:/opencv/sources/data/haarcascades/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]try:roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)params = model.predict(roi)print("Label: %s, Confidence: %.2f" % (params[0], params[1]))cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)except:continuecv2.imshow("camera", img)if cv2.waitKey(1000 // 12) & 0xff == ord('q'):breakcv2.destroyAllWindows()if __name__ == "__main__":face_rec(r'D:/data/')  //人脸数据路径img_path

运行上面代码的效果:

遗憾的是我没有尝试收集多人的人脸数据,然后实现多人识别的效果(这个现在没有很空闲,等有时间再来尝试吧,预留个位置以后敲写完整),而且上面只是基于Eigenfaces的人脸识别,当然以后也会尝试下面剩下的两种方法。
opencv3 有三种人脸识别的方法,它们分别基于三种不同的算法:Eigenfaces, Fisherfaces,Local Binary Patter Histogram ( LBPH ) 。这三种方法都有类似的过程,即都是使用了分好类的训练数据集(人脸数据库,每一个人都有很多样本)来进行训练,对图像或视频中检测到的人脸进行分析,并从两方面来确定:是否识别到目标;目标真正被识别到的置信度的度量,也称为置信度评分。
关于Eigenfaces, Fisherfaces,Local Binary, Patter Histogram ( LBPH ) 详解可以自己查阅
最后要补充的一个地方是我在学习过程中有些在有了人脸数据以后要生成csv文件,代码也在这里给出来:

import sys
import os.path# This is a tiny script to help you creating a CSV file from a face
# database with a similar hierarchie:
#
#  philipp@mango:~/facerec/data/at$ tree
#  .
#  |-- README
#  |-- s1
#  |   |-- 1.pgm
#  |   |-- ...
#  |   |-- 10.pgm
#  |-- s2
#  |   |-- 1.pgm
#  |   |-- ...
#  |   |-- 10.pgm
#  ...
#  |-- s40
#  |   |-- 1.pgm
#  |   |-- ...
#  |   |-- 10.pgm
#if __name__ == "__main__":#if len(sys.argv) != 2:#    print "usage: create_csv <base_path>"#    sys.exit(1)#BASE_PATH=sys.argv[1]BASE_PATH="D:/data/lijiale"SEPARATOR=";"fh = open("D:/data/lijiale/at.txt",'w')label = 0for dirname, dirnames, filenames in os.walk(BASE_PATH):for subdirname in dirnames:subject_path = os.path.join(dirname, subdirname)for filename in os.listdir(subject_path):abs_path = "%s/%s" % (subject_path, filename)print ("%s%s%d" % (abs_path, SEPARATOR, label))fh.write(abs_path)fh.write(SEPARATOR)fh.write(str(label))fh.write("\n")      label = label + 1fh.close()

这个代码是opencv源码包里面自带的,你需要的是改下路径。
感谢你们的支持,如需转载请标注作者。

opencv(人脸检测和识别)相关推荐

  1. Qt之OpenCV人脸检测以及识别

    简介 最近做了一个人脸检测以及识别的程序,很多的文章都有比较详细的叙述,可以自行查找.但是个人觉得大部分文章都太细致了以至于初学者无法快速领会主干(不是否认质量),是侧重点问题.所以结合我遇到了一些问 ...

  2. 人脸识别案例:【实战】opencv人脸检测+Haar特征分类器

    1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器.我们需要从其中提取特征.下图中的 Haar 特征会被使用,就像我们的卷积核 ...

  3. keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

    人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法. Keras系列: 1.keras系列︱Sequential与Model模型.kera ...

  4. 人脸识别系统——OpenCV人脸检测

    EduCoder:人脸识别系统--OpenCV人脸检测 第1关:图片基本操作 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求: 导入openCV库(cv2): 读取路径 s ...

  5. 【EduCoder答案】人脸识别系统——OpenCV人脸检测

    简介 答案查询的入口网页版 其他各类实训答案的目录见这里 答案获取的方法简介见这里 并不是所有的关卡都有答案,有些只有部分关卡有 不要直接复制答案哦 人脸识别系统 -- OpenCV人脸检测 > ...

  6. 基于opencv的人脸检测与识别(python)(1)

    基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...

  7. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  8. python实现人脸检测及识别(1)---- 采集人脸数据

    本次项目是采用keras深度学习框架,训练人脸识别模型,采用opencv实时检测与识别周围的人脸,本文主要讲解如何采集训练集,本次代码在人脸识别的代码上添加了将识别的照片依次写入指定文件夹,并命名(0 ...

  9. 人脸检测和识别的开源库总结

    背景 人脸相关的任务有以下几种: 人脸检测(将图片中包含的人脸进行初步定位,以及关键点如眼睛.鼻子.嘴巴等更精细的定位,文章封面即为典型人脸检测结果): 人脸跟踪(视频中跟踪人脸位置变化): 人脸验证 ...

  10. 目标人脸检测与识别(计算机视觉)

    一.实验目的 通过python 语言编程设计人脸检测算法,以此人脸作为训练样本,训练目标人脸模型,进一步实现目标人脸的识别.通过上述编程促进学生理解并掌握人脸检测及识别的相关原理,同时培养学生的编程能 ...

最新文章

  1. 逻辑覆盖测试(四)判定/条件覆盖
  2. 【Java】 5.6 类的继承
  3. leetcode336. 回文对(字典树)
  4. 【转载】Python线程、进程和协程详解
  5. git 分支管理策略 与 物理实现 --author by阮一峰 小鱼
  6. [HNOI2011]数学作业
  7. win10系统日志显示不可用sid_win10系统电脑修改sid安全标识符的操作方法
  8. 23种设计模式(十二)对象性能之享元模式
  9. Extjs介绍及视频教程
  10. cadlisp点选面积标注_一个在CAD中标注坐标的LISP
  11. 爬虫 --- 08. 全站爬取(CrawlSpider), 分布式, 增量式爬虫
  12. cf1299C-Water Balance
  13. 【Linux系列文章】Shell开发
  14. Vue解决导出pdf文件图片展示不全问题
  15. Linux arm 下载程序,在Linux下使用kermit和dnw给ARM板下载程序
  16. DurIAN模型介绍
  17. 提升个人效率减少焦虑——GTD法则
  18. rtmp/rtsp测试地址 2019/11/22日亲测可用
  19. php面试题3---php面试题系列
  20. Odoo开源ERP:功能模块操作-销售功能篇

热门文章

  1. electron使用下载监听接口(will-download)出现不触发done
  2. dg打开软件Android,DG 文件扩展名: 它是什么以及如何打开它?
  3. dwg文件怎么打开呢?dwg是啥呢?
  4. 证件照制作小程序源码下载-超级实用工具
  5. java栈与堆的区别
  6. ios系统设置z-index不生效问题
  7. Presto Connector 实现原理
  8. html中表格修改标题间距,css表格间距怎么调?
  9. 04、js、jqurey
  10. Codeforces Round #787 (Div. 3) F. Vlad and Unfinished Business