访问请移步至(David’s Wikipedia) https://www.qingdujun.com/ ,这里有能“击穿”平行宇宙的乱序并行字节流…
本文包括两部分:人脸检测、人脸识别。其中人脸检测主要采用了Haar级联分类器,采用Eigenfaces算法实现了人脸识别。
注:环境为OpenCV3与Python3.6。
目录:
人脸检测
首先,看下Haar级联分类器,Haar特征都描述了相邻图像区域的对比模式。例如,边、顶点和细线都能生成具有判别性的特征。
- 具有尺度不变性;
- 不具有旋转不变性。
OpenCV3有个data/haarcascades
文件夹,包含了所有OpenCV的人脸检测XML文件。
- haarcascade_eye.xml
- haarcascade_eye_tree_eyeglasses.xml
- haarcascade_frontalcatface.xml
- haarcascade_frontalcatface_extended.xml
- haarcascade_frontalface_alt.xml
- haarcascade_frontalface_alt_tree.xml
- haarcascade_frontalface_alt2.xml
- haarcascade_frontalface_default.xml
- haarcascade_fullbody.xml
- haarcascade_lefteye_2splits.xml
- haarcascade_licence_plate_rus_16stages.xml
- haarcascade_lowerbody.xml
- haarcascade_profileface.xml
- haarcascade_righteye_2splits.xml
- haarcascade_russian_plate_number.xml
- haarcascade_smile.xml
- haarcascade_upperbody.xml
detectMultiScale(gray,
1.3, # scaleFactor图像的压缩率
5 # minNeighbors人脸矩形保留近邻数目的最小值
)
根据检测结果,可以看到,OpenCV人脸检测效果好像并不太好。
(青涩的胡歌)
静态图片检测
OpenCV自带的haarcascade_frontalface_default.xml
,在cv2/data/
目录下能找到,或者直接使用EveryThing类似的检索工具磁盘检索一下。
static_face_detect.py
# -*- coding: utf-8 -*-
import cv2
def detect(filename):
face_cascade = cv2.CascadeClassifier(
r'C:\AppInstall\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0),2)
cv2.namedWindow('Person Detected!')
cv2.imshow('Person Detected!',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
detect(r'C:\Users\qingdujun\Desktop\huge.jpg')
视频流实时检测
视频流实时检测与静态图片技术差不多,只不过多了一个视频帧读取的过程。当然,以下也检测了一下眼睛的位置。
video_face_detect.py
# -*- coding: utf-8 -*-
import cv2
def detect():
face_cascade = cv2.CascadeClassifier(
r'C:\AppInstall\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(
r'C:\AppInstall\Anaconda3\Lib\site-packages\cv2\data\haarcascade_eye.xml')
camera = cv2.VideoCapture(0