随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界。

首先看一下本实验需要的数据集,为了简便我们只进行两个人的识别,选取了beyond乐队的主唱黄家驹和贝斯手黄家强,这哥俩长得有几分神似,这也是对人脸识别的一个考验:

两个文件夹,一个为训练数据集,一个为测试数据集,训练数据集中有两个文件夹0和1,之前看一些资料有说这里要遵循“slabel”命名规则,但后面处理起来比较麻烦,因为目前opencv接受的人脸识别标签为整数,那我们就直接用整数命名吧:

为了方便,我们每个人用20张照片来训练,0代表黄家驹,1代表黄家强:

开始啦:检测人脸。这应该是最基本的,给我们一张图片,我们要先检测出人脸的区域,然后才能

进行操作,opencv已经内置了很多分类检测器,我们这次用haar:

def detect_face(img):

#将测试图像转换为灰度图像,因为opencv人脸检测器需要灰度图像

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#加载OpenCV人脸检测分类器Haar

face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

#检测多尺度图像,返回值是一张脸部区域信息的列表(x,y,宽,高)

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

# 如果未检测到面部,则返回原始图像

if (len(faces) == 0):

return None, None

#目前假设只有一张脸,xy为左上角坐标,wh为矩形的宽高

(x, y, w, h) = faces[0]

#返回图像的正面部分

return gray[y:y + w, x:x + h], faces[0]

2.有了数据集和检测人脸的功能后,我们就可以进行预训练了,最后返回所有训练图片的人脸检测信息和标签:

# 该函数将读取所有的训练图像,从每个图像检测人脸并将返回两个相同大小的列表,分别为脸部信息和标签

def prepare_training_data(data_folder_path):

# 获取数据文件夹中的目录(每个主题的一个目录)

dirs = os.listdir(data_folder_path)

# 两个列表分别保存所有的脸部和标签

faces = []

labels = []

# 浏览每个目录并访问其中的图像

for dir_name in dirs:

# dir_name(str类型)即标签

label = int(dir_name)

# 建立包含当前主题主题图像的目录路径

subject_dir_path = data_folder_path + "/" + dir_name

# 获取给定主题目录内的图像名称

subject_images_names = os.listdir(subject_dir_path)

# 浏览每张图片并检测脸部,然后将脸部信息添加到脸部列表faces[]

for image_name in subject_images_names:

# 建立图像路径

image_path = subject_dir_path + "/" + image_name

# 读取图像

image = cv2.imread(image_path)

# 显示图像0.1s

cv2.imshow("Training on image...", image)

cv2.waitKey(100)

# 检测脸部

face, rect = detect_face(image)

# 我们忽略未检测到的脸部

if face is not None:

#将脸添加到脸部列表并添加相应的标签

faces.append(face)

labels.append(label)

cv2.waitKey(1)

cv2.destroyAllWindows()

#最终返回值为人脸和标签列表

return faces, labels

3.有了脸部信息和对应标签后,我们就可以使用opencv自带的识别器来进行训练了:

#调用prepare_training_data()函数

faces, labels = prepare_training_data("training_data")

#创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器

face_recognizer = cv2.face.LBPHFaceRecognizer_create()

face_recognizer.train(faces, np.array(labels))

4.训练完毕后就可以进行预测了,在这之前我们可以设定一下预测的格式,包括用矩形框框出人脸并标出其名字,当然最后别忘了建立标签与真实姓名直接的映射表:

#根据给定的(x,y)坐标和宽度高度在图像上绘制矩形

def draw_rectangle(img, rect):

(x, y, w, h) = rect

cv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)

# 根据给定的(x,y)坐标标识出人名

def draw_text(img, text, x, y):

cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)

#建立标签与人名的映射列表(标签只能为整数)

subjects = ["jiaju", "jiaqiang"]

5.现在就可以定义我们的预测函数了:

# 此函数识别传递的图像中的人物并在检测到的脸部周围绘制一个矩形及其名称

def predict(test_img):

#生成图像的副本,这样就能保留原始图像

img = test_img.copy()

#检测人脸

face, rect = detect_face(img)

#预测人脸

label = face_recognizer.predict(face)

# 获取由人脸识别器返回的相应标签的名称

label_text = subjects[label[0]]

# 在检测到的脸部周围画一个矩形

draw_rectangle(img, rect)

# 标出预测的名字

draw_text(img, label_text, rect[0], rect[1] - 5)

#返回预测的图像

return img

6.最后使用我们test_data中的图片进行预测并显示最终效果:

#加载测试图像

test_img1 = cv2.imread("test_data/test1.jpg")

test_img2 = cv2.imread("test_data/test2.jpg")

#执行预测

predicted_img1 = predict(test_img1)

predicted_img2 = predict(test_img2)

#显示两个图像

cv2.imshow(subjects[0], predicted_img1)

cv2.imshow(subjects[1], predicted_img2)

cv2.waitKey(0)

cv2.destroyAllWindows()

来看看识别的结果:

这就是人脸识别最基本的流程,后续还会进一步的研究,下一篇我们将讨论本次实验的一些细节和注意事项,算是对本篇的一次挖掘和总结吧。最后附上完整代码:

# # -*- coding:utf-8 -*-

import cv2

import os

import numpy as np

# 检测人脸

def detect_face(img):

#将测试图像转换为灰度图像,因为opencv人脸检测器需要灰度图像

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#加载OpenCV人脸检测分类器Haar

face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

#检测多尺度图像,返回值是一张脸部区域信息的列表(x,y,宽,高)

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

# 如果未检测到面部,则返回原始图像

if (len(faces) == 0):

return None, None

#目前假设只有一张脸,xy为左上角坐标,wh为矩形的宽高

(x, y, w, h) = faces[0]

#返回图像的正面部分

return gray[y:y + w, x:x + h], faces[0]

# 该函数将读取所有的训练图像,从每个图像检测人脸并将返回两个相同大小的列表,分别为脸部信息和标签

def prepare_training_data(data_folder_path):

# 获取数据文件夹中的目录(每个主题的一个目录)

dirs = os.listdir(data_folder_path)

# 两个列表分别保存所有的脸部和标签

faces = []

labels = []

# 浏览每个目录并访问其中的图像

for dir_name in dirs:

# dir_name(str类型)即标签

label = int(dir_name)

# 建立包含当前主题主题图像的目录路径

subject_dir_path = data_folder_path + "/" + dir_name

# 获取给定主题目录内的图像名称

subject_images_names = os.listdir(subject_dir_path)

# 浏览每张图片并检测脸部,然后将脸部信息添加到脸部列表faces[]

for image_name in subject_images_names:

# 建立图像路径

image_path = subject_dir_path + "/" + image_name

# 读取图像

image = cv2.imread(image_path)

# 显示图像0.1s

cv2.imshow("Training on image...", image)

cv2.waitKey(100)

# 检测脸部

face, rect = detect_face(image)

# 我们忽略未检测到的脸部

if face is not None:

#将脸添加到脸部列表并添加相应的标签

faces.append(face)

labels.append(label)

cv2.waitKey(1)

cv2.destroyAllWindows()

#最终返回值为人脸和标签列表

return faces, labels

#调用prepare_training_data()函数

faces, labels = prepare_training_data("training_data")

#创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器

face_recognizer = cv2.face.LBPHFaceRecognizer_create()

face_recognizer.train(faces, np.array(labels))

#根据给定的(x,y)坐标和宽度高度在图像上绘制矩形

def draw_rectangle(img, rect):

(x, y, w, h) = rect

cv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)

# 根据给定的(x,y)坐标标识出人名

def draw_text(img, text, x, y):

cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)

#建立标签与人名的映射列表(标签只能为整数)

subjects = ["jiaju", "jiaqiang"]

# 此函数识别传递的图像中的人物并在检测到的脸部周围绘制一个矩形及其名称

def predict(test_img):

#生成图像的副本,这样就能保留原始图像

img = test_img.copy()

#检测人脸

face, rect = detect_face(img)

#预测人脸

label = face_recognizer.predict(face)

# 获取由人脸识别器返回的相应标签的名称

label_text = subjects[label[0]]

# 在检测到的脸部周围画一个矩形

draw_rectangle(img, rect)

# 标出预测的名字

draw_text(img, label_text, rect[0], rect[1] - 5)

#返回预测的图像

return img

#加载测试图像

test_img1 = cv2.imread("test_data/test1.jpg")

test_img2 = cv2.imread("test_data/test2.jpg")

#执行预测

predicted_img1 = predict(test_img1)

predicted_img2 = predict(test_img2)

#显示两个图像

cv2.imshow(subjects[0], predicted_img1)

cv2.imshow(subjects[1], predicted_img2)

cv2.waitKey(0)

cv2.destroyAllWindows()

伙伴们有哪些地方不清楚的可以留言哦!

opencv python 人脸识别 相似度_Python学习:基于Opencv来快速实现人脸识别(完整版)...相关推荐

  1. python用函数绘制椭圆_Python学习笔记——opencv绘制椭圆

    在Python环境下使用opencv绘制椭圆,需要用到cv2.ellipse() 函数. 下面一段示例程序就是用该函数在黑色背景下,绘制一个圆心在(260,240).长轴170.短轴130.线宽为3的 ...

  2. python二维码生成识别代码_Python学习案例之二维码生成识别

    前言 在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低.不过就最新版本的测试来说,识别率有了现显著提高. 对比 ...

  3. python爬虫库的功能_Python学习爬虫掌握的库资料大全和框架的选择的分析

    学Python,想必大家都是从爬虫开始的吧.毕竟网上类似的资源很丰富,开源项目也非常多. Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 当我们在浏览器中输入一个url后回车,后台会发生 ...

  4. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...

    图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...

  5. python游戏编程网课_Python 学习最佳方式_创建游戏_编程一个机器人

    Python 是世界上功能最多且最强大的编程语言之一.使用 Python,你可以编写自己的应用程序,创建游戏.设计算法.甚至编程一个机器人.学习 Python 还可以担任软件工程师.Web 开发人员. ...

  6. Python图像识别实战(三):基于OpenCV实现批量单图像超分辨重建(附源码和实现效果)

    前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章). 从本期开始,我将做一个关于图像识别的系列文章,让读者慢慢理解 ...

  7. python程序设计基础与应用董付国电子版_Python 程序设计基础(董付国 著)完整版PDF_IT教程网...

    资源名称:Python 程序设计基础(董付国 著)完整版PDF 全书共9章,主要内容组织如下:第1章介绍Python基本知识与概念:第2章讲解列表.元组.字典.集合等序列的常用方法和基本操作:第3章讲 ...

  8. opencv canny源码解析_行人检测 基于 OpenCV 的人体检测

    原文链接 行人检测 基于 OpenCV 的人体检测 - 热分享​hotdog29.com 在 2019年8月1日 上张贴 由 hotdog发表回复 行人检测 基于 OpenCV 的人体检测 我们都知道 ...

  9. 人脸扫描建模_一种基于三维扫描数据的人脸建模方法

    一种基于三维扫描数据的人脸建模方法 黄炎辉 1 , 樊养余 1 , 董卫军 2 [摘 要] 三维扫描仪可以准确获取人脸的几何形状与纹理,但原始的人脸扫描 数据仅为一张连续曲面,不符合实际的人脸结构,无 ...

  10. 计算识别率的matlab代码,基于MATLAB神经网络图像识别的高识别率代码

    更新时间: 2019年3月14日10:50:04作者: 钱190 今天,我将与您分享一个基于MATLAB神经网络图像识别的高识别代码. 我认为内容非常好. 现在我与大家分享. 具有很好的参考价值. 需 ...

最新文章

  1. 幽默感七个技巧_如何通过三招,让自己成为一个有幽默感的说话高手?
  2. java中的多线程的示例
  3. 信安精品课:第4章网络安全体系与网络安全模型精讲笔记
  4. python环境配置(三)——notepad ++配置python开发环境
  5. Google 击败苹果!| 极客头条
  6. 使用Kotlin的Android Spinner
  7. linux和Windows之间共享文件
  8. 华为U2000网管研究实录 (2) - 数据库与第三方组件
  9. lj245a引脚功能图_JRC4558中文资料|引脚图及功能|应用电路图
  10. 浅谈安卓Xutils框架(一)
  11. 电阻元件、电感元件、电容元件
  12. 【服务器托管单线、双线以及多线如何区别】
  13. Python爬取网易云音乐歌手歌曲和歌单!推荐好听的歌吗?
  14. html视频如何转换成mp4视频格式,将MP4、MPEG、MOV等格式的视频转换成WEBM格式的方法...
  15. 国产手机再次发力,是否可以阻击三星苹果
  16. linux内核结构体初始化时出现的.owner = THIS_MODULE
  17. VTK-修改图片的像素
  18. 英文、数字和汉字、日文的字符判断 英文占1个字符,中文汉字占2个字符 el-form表单验证规则
  19. 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接
  20. 教务管理系统(免费源码获取)

热门文章

  1. openwrt下如何生成ipk包到对应的开发板上运行 以helloword为例(三)
  2. vue-codemirror 代码编辑器
  3. HTML+CSS静态页面网页设计作业 仿天猫购物商城(7页) 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
  4. 计算机中xp系统中qq文件,从做完xp系统怎样恢复qq文?
  5. adb shell ping
  6. 〔翻译〕摩托罗拉E680的linux系统解码
  7. 【STM32】PS2遥控手柄使用和程序移植
  8. chrome源代码下载 编译 linux,源代码编译chrome os
  9. 计算机找不到链接打印机主机,电脑连接打印机厂商型号没有怎么办
  10. 数学建模中的传染病模型及其编程求解