Qt之OpenCV人脸检测以及识别

简介

最近做了一个人脸检测以及识别的程序,很多的文章都有比较详细的叙述,可以自行查找。但是个人觉得大部分文章都太细致了以至于初学者无法快速领会主干(不是否认质量),是侧重点问题。所以结合我遇到了一些问题,现在做个总结。本文主要叙述实现的思路,对大的方向有了解了,剩下的结合其他详细文章自然水到渠成。

环境

版本:Qt 5.12.6

IDE: QtCreator 4.10.2

编译器:MSVC2017 64bit

OpenCV版本:4.5.1

OpenCV版本

先上图

人脸检测和人脸识别是两个方面。一个是检测某个画面中有没有人脸,而另一个是要识别的出现的人脸是谁。所以作为一个强大的开源库,对于基本的人脸检测功能,直接下载的库已经可以实现此功能了,即opencv(图中标注1)。但是对于人脸识别高阶一点的功能这个版本是不支持的,所以需要opencv_contrib扩展版本(图中标注2),可以理解为在原来的库基础上增加了很多高级功能,人脸识别就包括在里面。但要保证基础库和扩展库的版本号要一致。所以想要人脸识别的功能就要把扩展库再编译进来。方式就是通过cmake工具,重新编译生成新的lib以及动态库dll,具体操作自行百度,按部就班操作也很简单。图中标注3就是编译后的库,有了库导入工程后,自然天高任鸟飞,看自己的发挥了。我使用的是msvc编译器编译,mingw理论是一样的,这里我没有尝试。这里编译的opencv源码用来生成库的编译器是MSVC2017 64bit。自己的人脸代码引用该库也要注意编译器的一致,你要是用个MinGW,还是个32位的编译器,那你不会快乐了。

人脸检测以及识别原理

人脸检测

人脸检测就是检测某个画面内是不是人脸,顶多再框起来醒目一点。人的面目基本的是结构相同的,比如眉眼鼻口耳,都是有的。类比代码就是对外接口相同,细节实现不同。大的接口相同,就是大的特征相同,官方把这种特征抽象到一个文件(比如haarcascade_frontalface_default.xml),可以理解为已经设置好了一些条件,当输入的一张图片符合这些条件就认为是人脸。自己获得区域返回值,通过位置可以把脸部圈起来。

人脸识别

对于人脸识别,不再是检测出来是人脸就行,而是还识别出来是谁。大道至简,其实就这样理解,有五个人你分别见一面,记住他们的面容以及姓名。然后单独挑出来一个,你说出来他们的姓名就算是识别出来了。然后把这个过程类比到计算机处理过程,五个人分别见面并记住他们的面容姓名,属于训练;单独挑一个人属于识别。

然后再深入类比一下,就是计算机如何进行训练以及识别呢?

训练:假设有三人xiaoA,xiaoB,xiaoC的照片,对应编号1,2,3;生成文档如下形式

xiaoA.jpg;1

xiaoB.jpg;2

xiaoC.jpg;3

opencv内部会读取照片以及对应编号,相当于把xiaoA.jpg包含的特征信息与编号1绑定, xiaoB的特征信息与2绑定,xiaoC也一样绑定。此时xiaoA又拿出一张自己的照片,让机器识别,因为是同一个人所以和xiaoA.jpg的特征信息很相似,机器返回绑定号1,即识别出是xiaoA。编号是数字,是自定义的,自己可以用map建立对应关系,比如编号1即是xiaoA

当然为保证准确率,每个人理论上的照片越多训练的效果越好(一般10个就可以了),识别会更准确。现在假设每个人三张照片训练的话,那么文档内容形式如下

xiaoA1.jpg;1

xiaoA2.jpg;1

xiaoA3.jpg;1

xiaoB1.jpg;2

xiaoB2.jpg;2

xiaoB3.jpg;2

xiaoC1.jpg;3

xiaoC2.jpg;3

xiaoC3.jpg;3

实践思路

结合以上,大致步骤如下

1. 使用opencv的方法打开摄像头,进行屏幕截图,每张截图对应一个编号,将图片路径以及编号写入文件例如data.txt,格式上文已经叙述。

2. 获得步骤一的文件data.txt,解析数据,训练模型

3. 再次打开摄像头,获得人脸数据,模型返回编号,根据对应关系得出人脸是谁。

除了步骤一需要写一些控制逻辑外,步骤二、三其实调用几个函数即可。具体的就需要自己对应去找了,也很简单。

最后

这篇是定位思路、实现方式的文章,没有细节实现,但是把脉络理清,按部就班,问题各个击破就可以。

 

猜你喜欢

转载自blog.csdn.net/T__zxt/article/details/115801137