基于OpenCV自带分类器识别人脸
在VS2019下要安装适用于桌面的VC++ 2015(2017) v14 00(v14)工具集。
访问网站:https://visualstudio.microsoft.com/zh-hans/downloads,下载社区版,并安装
安装完成之后进入这个界面:
安装所需要的组件
安装完成后重启vs即可
二、安装Opencv3.4.5
关于在VS下对Opencv的配置:
OpenCV下载地址:http://opencv.org/或者直接搜OpenCV下载,找到对应的版本下载,应该是个压缩包,解压,可以看到两个文件夹:
(1)添加环境变量
电脑左上角找到“我的电脑”,点击鼠标右键,依次选择“属性”、“高级系统设置”、“环境变量”、“Path”。
双击“Path”进入到“编辑环境变量”页面,通过新建或者浏览的方式将opencv的“bin文件夹路径”添加到环境变量中,看看自己的电脑是64位还是32位,如果不知道vc14还是vc15可以看下面的VS版本和OpenCV中vc的对应关系表。
注意:添加完环境变量之后最好重启一下电脑,使环境变量生效,不重启的话有可能会出现环境变量未生效这种情况。如果环境变量未生效,那么就找不到OpenCV的dll文件,会报计算机丢失xxx.dll。
(2)添加OpenCV包含目录和库目录
打开Visual Studio,新建一个C++项目,在Visual Studio左上角菜单栏,依次选择“视图”、“其他窗口”、“属性管理器”。找到自己对应的Debug和Release模式,比如说我目前想使用x64的Debug,我就选择第二项下的“Microsoft.Cpp.x64.user”。
右键选择“属性”,进入“Microsoft.Cpp.x64.user的属性页”,依次选择“通用属性”、“VC++目录”,开始添加“包含目录”、“库目录”。
选择“包含目录”,进入“包含目录”页面,添加OpenCV包含目录路径:
D:\OpenCV342\opencv\build\include
D:\OpenCV342\opencv\build\include\opencv
D:\OpenCV342\opencv\build\include\opencv2
选择“库目录”,进入“库目录”页面,添加库目录(lib文件夹)路径:
D:\OpenCV342\opencv\build\x64\vc14\lib
(3)添加附加依赖项
添加附加依赖项就是添加所有的lib文件路径,这些lib文件都是在前面那个库目录里面保存的。由于OpenCV2和OpenCV3之间的不同,相应的附加依赖项也就不同。
依次选择“链接器”、“输入”、“附加依赖项”,进入“附加依赖项”页面,开始添加lib文件路径。
到此,OpenCV就算是配置完了。
三、人脸检测
Opencv的人脸检测函数,定义了具体可跟踪对象类型的数据文件。
Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配。
两个图像的相似程度可以通过它们对应特征的欧式距离来度量。距离可能以空间坐标或颜色坐标来定义。类Haar特征是一种用于实现实时人脸跟踪的特征。每个类Haar特征都描述了相邻图像区域的对比模式。例如,边,顶点和细线都能生成具有判断性的特征。
Haar级联级具有尺度不变性,换句话说,它在尺度变化上具有鲁棒性。但是,opencv的Haar级联不具有旋转不变性。
在opencv源代码的副本中会有一个文件夹data/haarcascades,该文件夹包括了所有opencv的人脸检测的xml文件,这些文件可用于检测静止图像,视频和摄像头所得到图像中的人脸。
静态图像中的人脸检测:
import cv2 as cv
filename = 'D:/timg.jpg'
face_cascade = cv.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
//注意用绝对路径就不会报错
img = cv.imread(filename)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
img = cv.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv.namedWindow('Vikings Detected')
cv.imshow('Vikings Detected', img)
cv.waitKey(0)
摄像头下的人脸检测:
import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
while True:
ret,img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.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('img',img)
if cv2.waitKey(1) &0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()