在上一篇文章中,我们学习了如何安装配置OpenCV和Python,然后写了些代码玩玩人脸检测。现在我们要进行下一步了,即搞一个人脸识别程序,就是不只是检测还需要识别到人是谁。

来,搞人脸识别

要搞一个人脸识别程序,首先我们需要先用提前裁剪好的标注好的人脸照片训练一个识别器。比如说,我们的识别器需要识别两个人,一个人的id是1,而另一个的id是2,于是在数据集里面,1号人的所有照片会有id 1号,2号人同理。然后我们就会使用这些数据集照片去训练识别器,再从一个视频中识别出1号人。

我们把要做的事分成三部分:

创建数据集

训练

识别

在本文中,我们会尝试写一个程序来生成数据集。

生成数据集

我们来写一个数据集生成脚本。

首先打开我们的Python环境,不管是Pycharm等IDE,还是简单的记事本都行。需要提前准备的是在目录中放好haarcascade_frontalface_default.xml,上一篇也有用到过这个XML文件,就是OpenCV自带的。

接下来使用cv2获取摄像头数据以及XML文件:

import cv2

cam = cv2.VideoCapture(0)

detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

我们的数据集需要先从摄像头采集一些人脸例子照片,当然,只能是同一个人的。然后程序会给这些例子照片添加id,并将照片保存在一个文件夹中,这个文件夹我们就将它命名为dataSet吧。

来,我们在py脚本的同目录下创建一个dataSet的文件夹。为了不会将不同的人脸照片弄混,我们需要定一个命名规则,用于给照片命名。

例如,命名规则为User.[ID].[SampleNumber].jpg。如果是2号人的第十张照片,我们可以将它命名为User.2.10.jpg。

为什么要定义这样的格式呢?因为这样,在加载照片训练的时候,我们就可以只通过照片的文件名,就能简单地判断是几号用户的人脸照片。

接下来,我们尝试用比较简单的方法,通过shell输入,来获取人的id,并且初始化计算器变量来存储人们的例子数。

Id = raw_input('enter your id: ')

sampleNum = 0

然后我们加入一个主循环,我们会从视频流中输入20个例子,然后把例子都保存在已经创建好的dataSet文件夹。

这是之前写过的代码版本,用于人脸检测:

while True:

ret, img = cap.read()

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

faces = detector.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('frame', img)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

现在我们将它改造成数据集生成程序:

while True:

ret, img = cap.read()

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

faces = detector.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)

# 增加例子数

sampleNum = sampleNum + 1

# 把照片保存到数据集文件夹

cv2.imwrite("dataSet/user." + str(Id) + '.' + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w])

cv2.imshow('frame', img)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

我们添加了两行代码,用以计算例子数,以及将人脸照片按照我们的命名规则保存为jpg格式。

其中有一个值得注意的地方,就是gray[y : y + h, x : x + w]。此处我们是把一张灰度图片看成一个二维数组(或二维矢量),然后使用python中[]截取OpenCV检测出来的人脸区域。

不过这样的代码会在一秒内快速地生成许多照片,比如说20张。我们不想要那么快,我们需要的是更好的素材,比如说从不同角度拍摄出来的照片,这样的话,要求慢一点。

为了慢一点,我们需要提高一下两次拍摄之间的延迟。同时,我们素材不需要太多,20张就好。

while True:

ret, img = cap.read()

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

faces = detector.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)

# 增加例子数

sampleNum = sampleNum + 1

# 把照片保存到数据集文件夹

cv2.imwrite("dataSet/User." + str(Id) + '.' + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) #

cv2.imshow('frame', img)

# 延迟100毫秒

if cv2.waitKey(100) & 0xFF == ord('q'):

break

# 超过20张就可以停了

elif sampleNum > 20:

break

好,继续,现在的代码就会在两个拍摄间延迟100毫秒,100毫秒足够让我们去移动我们人脸的角度了(时间不够长就再加)。而且,在拍摄20张后就停止了。

最后记得释放资源:

cap.release()

cv2.destroyAllWindows()

放出完整代码:

import cv2

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

cap = cv2.VideoCapture(0)

sampleNum = 0

Id = raw_input('enter your id: ')

while True:

ret, img = cap.read()

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

faces = detector.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)

# incrementing sample number

sampleNum = sampleNum + 1

# saving the captured face in the dataset folder

cv2.imwrite("dataSet/User." + str(Id) + '.' + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) #

cv2.imshow('frame', img)

# wait for 100 miliseconds

if cv2.waitKey(100) & 0xFF == ord('q'):

break

# break if the sample number is morethan 20

elif sampleNum > 20:

break

cap.release()

cv2.destroyAllWindows()

生成结果

image

如图,已经生成了一堆训练素材了。

先这样吧

原文,若有错误之处请指出,更多地关注煎鱼。

python虚拟人脸生成_Python-OpenCV人脸识别之数据集生成相关推荐

  1. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  2. c#结合emgucv进行人脸检测_Python实时人脸识别/替换

    摄像头中的人脸检测,也是人脸识别的一部分, 摄像头播放的画面本质上是按帧将图片拼凑起来的, 有图片的话,获取图片的中人脸呢再上一篇中我们已经涉及了 想要进行人脸识别, 我们需要OpenCV, 还是先来 ...

  3. python判断性别程序_python 实现性别识别

    使用keras实现性别识别,模型数据使用的是oarriaga/face_classification的模型 实现效果 准备工作 在开始之前先要安装keras和tensorflow 安装keras使用命 ...

  4. python 魔兽世界升级脚本_Python 实现数据库更新脚本的生成方法

    我在工作的时候,在测试环境下使用的数据库跟生产环境的数据库不一致,当我们的测试环境下的数据库完成测试准备更新到生产环境上的数据库时候,需要准备更新脚本,真是一不小心没记下来就会忘了改了哪里,哪里添加了 ...

  5. python实现面部特效_Python实现人脸带墨镜效果

    DEAL WITH IT是这样一个效果,眼镜从屏幕外飞进来,带在用户的脸上.这种效果的最佳实例是以一种独特的方式完成的. 今天,我们将编写一个生成器,该生成器使用任何有面部的静态图像作为输入.如果你想 ...

  6. python图片识别是否p过_Python+Opencv进行识别相似图片

    标签:在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在 ...

  7. python实现视频人脸替换_python换人脸视频教程(怎样制作人脸从小到老的变化视频?)...

    怎么用ps来p视频和动态图中的人脸(换成别的脸就像b站中的鬼畜区的那种p法)求视频教程 时间轴 如何用机器自动替换视频中的人物脸? 基本做不 视频中的人物主体,是在移动的部也是在变化的背景是复杂不是纯 ...

  8. python实现运动模糊图像_python opencv生成模糊图像

    去除由于对焦,运动等造成的模糊图像,所以在构建数据集的时候考虑用opencv对清晰的图片进行处理获得模糊的图片从而进行训练. 1) 运动模糊图像 一般来说,运动模糊的图像都是朝同一方向运动的,那么就可 ...

  9. python获取摄像头型号_python opencv设置摄像头分辨率以及各个参数的方法_python

    下面就为大家分享一篇python opencv设置摄像头分辨率以及各个参数的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1,为了获取视频,你应该创建一个 VideoCapture 对 ...

最新文章

  1. 【牛腩新闻发布系统】开始前端03
  2. Uva(10048),最短路Floyd
  3. UVA208Firetruck 消防车(图的路径搜索)
  4. Java Process中waitFor()的问题
  5. 运行银联支付系统demo
  6. LeetCode 1074. 元素和为目标值的子矩阵数量(2d前缀和+哈希)
  7. python元组为什么不可变_为什么python字符串和元组是不可变的?
  8. 箱体图_靓爆了!东莞近千个市政箱体换上“新装”成街头风景线
  9. Gulp快速入门教程 1
  10. 基于买方意向的货物撮合交易_CCF货物撮合交易赛题 Baseline
  11. Android 程序随开机自动运行
  12. PHP距离春节还剩多少天,距离2019年春节还剩多少天 2019春节倒计时多少天
  13. Cesium开发环境搭建的几种方法总结
  14. 强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》
  15. 流媒体中的常用网络传输协议
  16. win10磁盘管理_一步一步的详细讲解Win10磁盘分区教程
  17. 使用PreListener与InteractionListener的一个小发现
  18. pytorch cuda
  19. oracle lag使用情景,lag函数用法
  20. ubuntu18.04 全局美化-------最全

热门文章

  1. mysql 返回自增id_mysql 返回自增id
  2. extern 详解(内有extern C 讲解)
  3. kali2020进入单模式_出租车使用“滴滴”平台 司机希望恢复抢单模式 滴滴出行有回应...
  4. 通过接口的协议理解sort的本质
  5. python语言发展历时_编程语言十年发展史
  6. printf 重新实现put_Go 实现海量日志收集系统(四)
  7. vscode 推荐premiter_vscode 有哪些让人眼前一亮的插件?
  8. python中spider的用法_Spider-PyQuery基本用法(示例代码)
  9. vue 指令 v-on 事件修饰符-鼠标事件-什么是事件冒泡
  10. pytorch orchvision.transforms.Normalize