人脸识别最近几年比较流行,不接触还以为是什么高端什么代码,今天学学记录一下其实除去训练模型不好做,利用opencv还是很容易实现的,就来玩玩人脸识别。

人脸特征数据

训练数据据说不好训练这块我回头下一篇博客写一写,这里就直接用opencv里面自带的训练模型了,毕竟这方面已经做的很成熟了,直接在自己电脑的opencv里面找 。

人脸检测器(默认):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

OpenCV 人数识别_人脸检测

cv2 - data 图中标注的xml文档,就是模型下一步需要用到的模型,把它拷贝到自己的项目文档中,或者直接引用绝对地址也可以。

OpenCV 人数识别_xml_02

代码

import cv2

face_patterns = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

sample_image = cv2.imread('/Users/abel/201612.jpg',0)

faces = face_patterns.detectMultiScale(sample_image,scaleFactor=1.1,minNeighbors=5,minSize=(100, 100))
for (x, y, w, h) in faces:
    cv2.rectangle(sample_image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imwrite('/Users/abel/201612_detected.png', sample_image);

解释一下代码的含义:
face_patterns就是级联分类器,里面是训练模型的路径,这里我直接拷贝到自己的文件夹下来了。
sample_image打开图像并且转换成灰度图像
faces 存储人脸坐标和宽度,是一个二重list列表
接下来一个for循环利用rectangle来标出来人脸就很简单了。

看一下face_patterns.detectMultiScale里面的几个参数
第一个就传入我们的灰度图像
第二个scalefactor每一个图像尺度中的尺度参数,默认值为1.1。scale_factor参数可以决定两个不同大小的窗口扫描之间有多大的跳跃,这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体。
第三个参数为每一个级联矩形应该保留的邻近个数,默认为3
其他不重要可有可无。

结合摄像头的人脸识别代码

import cv2

# 打开摄像头
face_patterns = cv2.CascadeClassifier('facemodel.xml')
capture = cv2.VideoCapture(0)
while True:
    ret, img = capture.read()
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_patterns.detectMultiScale(img_gray)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    cv2.imshow('img',img)
    cv2.waitKey(5)