首页 > temp > 简明python教程 >
-
基于opencv和pillow实现人脸识别系统(附demo)
人脸识别就是一个程序能识别给定图像或视频中的人脸,本文主要介绍了opencv和pillow实现人脸识别系统,本文不涉及分类器、训练识别器等算法原理,感兴趣的可以了解一下
目录
本文不涉及分类器、训练识别器等算法原理,仅包含对其应用(未来我也会写自己对机器学习算法原理的一些观点和了解)
首先我们需要知道的是利用现有框架做一个人脸识别系统并不难,然后就开始我们的系统开发吧。
我们的系统主要分为三个部分,然后我还会提出对补获图片不能添加中文的解决方案。我们需要完成的任务:1.人脸检测和数据收集2.训练识别器3.人脸识别和显示
在读此篇文章之前我相信你已经做了python环境部署和opencv模块的下载安装工作,现在我们还需要的模块是pillow(树莓派默认带有此模块,但如果你用的是win系统可能还需要另外安装,在终端输入pip install pillow即可),和opencv-contrib模块,cv2的face模块包含在内(当然我的Linux系统的树莓派貌似仍然默认包含了此模块,所以如果你是用的pc可能需要另外下载),以及最基本的numpy模块。
在开始写代码之前我们首先需要在当前运行目录中添加两个文件夹,dataset用于存放捕获到的人脸图像,方便后面训练识别器,trainer文件夹则存放了训练结果
一。人脸检测和数据收集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
在这一部分中我们完成了人脸的补获,并将其保存在了我们建立的dataset文件夹,并将每一个人的数据用特定的id表述,这样我们就能训练能识别不同人脸的识别器。cam.set这一步中第二个参数是图像的分辨率,640×480是opencv的默认分辨率,但其仍支持800×600且最大支持1280乘1024像素,即使你的摄像头最大允许分辨率远大于这个值,opencv貌似仍不会允许你使用。之后就是haar级联分类器的导入,在配置过程中,我们已经下载了opencv自带的分类器,你只需要在文件管理器中查找haarcascade_frontalface_default.xml这个文件即可,在这个文件所在的文件夹中有许多分类器,当然如果你要识别例如苹果香蕉等物体你可能需要训练新的分类器(这也很容易做到),本文讨论的是人脸识别,因此这里不再赘述,你可以选择用其绝对路径导入,当然你也可以像我一样将其复制到你当前目录中。然后进入循环,图片的读取->转灰度图,然后是使用你已经导入的分类器识别人脸并将其用方框标出,然后将方框内的图片储存入dataset文件夹中。值得一提的是,因为分类器的算法是很慢的,所以分类器本身就有减帧处理(即使这样我的树莓派带人脸识别系统仍然很吃力),所以faces应该是大部分时间都是空的元组,小部分时间是读取到的array数组,因此你需要特别注意缩进问题,不要让分类器本身的减帧影响你视频读取并显示的帧数。
二.训练识别器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
在这一步我们需要对识别器按照不同id分别训练并保存结果,并将结果汇总写入trainer文件夹中命名为trainer.yml。这个文件里就是训练好的识别器。
三.人脸识别和显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
在这一步中,很遗憾的是cv2.putText函数并不支持汉语的应用,即你不能通过这个函数将汉语姓名显示在视频中,虽然你可能会有英文名或干脆用汉语拼音,但这个问题我们必须要解决。因此我们在这里引入了pillow模块,我们只需要使用img.draw功能在图片上先打出你的姓名,再进行cv2.putText函数就能很好的解决这个问题,但是比较麻烦的是这两个函数涉及到的图片类型是不一样的,因此我在代码中对img和array图像进行了转换,最终完成了人脸识别系统。
到此这篇关于基于opencv和pillow实现人脸识别系统(附demo)的文章就介绍到这了
原文链接:https://blog.csdn.net/qq_45694203/article/details/112914948