50行代码运用Python+OpenCV来实现人脸追踪
嗨,我最亲爱的伙计们,很高兴我们又见面了。
做这个头条号,就是鄙人的一点兴趣,首先先感谢朋友们的关注。当然我更希望认识与计算机相关的领域的朋友咱们一起探讨交流。重点说一下,我是真人,不是那些扒文章的自媒体组织,大家可以相互交流的!
本篇文章我们来讲一下关于AI相关的人脸追踪,人脸识别相关的一些知识。当然本篇教程为(上)部分,讲一下利用python+opencv来实现人脸识别与追踪,下部分,用python来通过指纹对比实现人脸验证、人脸解锁(大家感兴趣的可以提前关注哦)。
这两节课呢,代码量都不是很多,鄙人尽量多注释点,便于大家理解。那我们就不多路匣傲耍苯由细苫酰
OpenCV:
opencv目前来讲是十分流行的视觉库,而且可以支持多语言。说到opencv就不得不说它的cascades分类器。
如果我们要判断一张图片是不是有一张脸,早期方式是通过成千上万的分类器去从头匹配到尾,这样看并没有什么什么毛病,但判断的图片多了呢?那可能需要猴年马月。opencv的cascades呢,就把这些用来判断人脸特征的容器划分成多块层层匹配,到一层不匹配就被丢弃。
这好比一群人去公司面试,公司第一个要求是只要男人,那一批女人就走了,公司说只要本科,一批专科走了,公司说要两年工作经验的,又会走一批,直到最后。这样的工作量比每个人面试不管男女都过一遍流程轻松的多。
环境拓扑:
操作系统:windows7
python版本:2.7.14
opencv版本:3.x
环境配置:
1.安装python(额...这个当我没说)
2.安装Opencv
这个从官网下载就OK啦:https://opencv.org/
印象中我记得当初我下载的是3.3版本,但现在好像Github最近访问不了了,我不知道是不是我的Hosts的问题还是怎么着,大家如果能访问可以给我留个言,我修复下hosts文件。如果大家也访问不了,可以留言或者私信,我把以前下载的opencv打包发给大家。
下载完之后直接解压就行,推荐解压到跟你的python安装的父路径。
3.使用pip安装numpy
打开cmd输入:
pip install numpy
进行安装,安装完毕后会给提示。
4.找到你的opencv安装路径(比如我的是D盘)
复制D:opencvopencv3.xuildpython.7\x64路径下的cv2.py
注意:我的windows版本为64位所以我选择的是X64,如果你的是32位的话你需要选择X86文件夹下的cv2.pyd
复制完之后,粘贴到你的python安装路径下的Lib/site-packages这个文件夹下。
完成上面这些就基本OK啦,我们在写代码之前先来测试一下,环境是否配置成功。
在CMD命令行下运行python:
import numpy import cv2
如果没有报错,说明安装完成。
实现原理:
1.调用计算机摄像头
cv2.Videocamture(0)
2.将摄像头数据按帧来取(相当于给每一帧图片的人脸加框框)
cam.red()
3.将每一帧摄像头记录的数据带入opencv让classifier去判断人脸
detectMultiScale()
4.如果存在人脸给人脸标记画框
cv2.rectangle()
5.输出画框后的帧动画
cv2.imshow('My Camera',frame)
代码实现:
第一步定义一个识别函数:
先放图片,这个地方比较重要,我在下面会详细的说一下。
6-7行代码说明:
首先创建classifier,为什么要弄这个呢?
引用的haarcascade开头的文件是opencv里面关于人脸级联分类器,你在opencv文件夹下的sourcesdatahaarcascades可以看到:
说明功能:
人脸检测器(默认):haarcascade_frontalface_default.xml
人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml
人脸检测器(侧视):haarcascade_profileface.xml
眼部检测器(左眼):haarcascade_lefteye_2splits.xml
眼部检测器(右眼):haarcascade_righteye_2splits.xml
嘴部检测器:haarcascade_mcs_mouth.xml
鼻子检测器:haarcascade_mcs_nose.xml
身体检测器:haarcascade_fullbody.xml
人脸检测器(快速LBP):lbpcascade_frontalface.xml
1:haarcascade_frontalface_alt.xml
Stump-based 20x20 gentle adaboost frontal face detector.
2:haarcascade_frontalface_alt2.xml
Tree-based 20x20 gentle adaboost frontal face detector.
3:haarcascade_frontalface_alt_tree.xml
Stump-based 20x20 gentle adaboost frontal face detector.This detector uses tree of stage classifiers instead of a cascade
4:haarcascade_frontalface_default.xml
Stump-based 24x24 discrete(?) adaboost frontal face detector.
以上这四个鄙人都测试过,haarcascade_frontalface_alt.xml这个效果是最好的,其它的大家可以单个测试。
设定灰度:
灰度的设定是为了增强面部轮廓的对比度,这是增加精度必不可少的。
核心代码解剖:
DetectMultiScale 函数是一个检测物体的通用函数,我们介绍一下:
gray:这是转换成灰度后的图片
scaleFactor:补偿参数,一般设置值为1.1-1.5比较好,效果大家自己改着看
minNeighbors:对当前其周围有多少物体进行定义
minSize:设定窗口大小
flags:略抽象,选择默认或者上图即可
画方框:
定义xywh利用for循环读取faces变量里面的坐标,然后通过rectangle()函数进行画方框。
代码下部分:
OK,写完代码之后,我们把上部分代码跟下部分代码拼凑起来,运行下试一下: