当前位置:首页 > 天道酬勤 > 正文内容

opencv的人脸检测(opencv人脸识别原理)

张世龙2021年12月20日 19:51天道酬勤400

本论文的学习资源来自《机器学习实践指南 案例应用解析》

一、人脸辨识概念

生物特征识别(BIOMETRICS )技术是指计算机利用人体固有的生理特征(指纹、虹膜、面相、DNA等)和行为特征)步态、按键习惯等)来确定个人身份的技术。 ——百度百科的人脸识别是生物特征识别技术之一。

二、OpenCV的人脸定位

OpenCV接口实现面部检测函数,并定义特定可跟踪对象类型的数据文件。 Haar级联分类器通过比较分析相邻图像区域来确定一个图像或者子图像是否与已知对象相匹配。 两个图像的相似度可以通过对应各自特征的欧式距离来测量。 可以用空间坐标或颜色坐标定义距离。 类Haar特征是实现实时人脸跟踪的特征。 各类Haar的特征描述了相邻图像区域的比较模式。 例如,边缘、顶点、细线都生成可判断的特征。

Haar级联具有尺度不变性,换言之,尺度变化具有鲁棒性。 但是,opencv的Haar级联不具有旋转不变性。

三、OpenCV的人脸检测函数说明

OpenCV1的函数: cvHaarDetectObjects

OpenCV2的函数:检测多路复用

detectMultiScale函数可以检测图像中所有人的面部,并通过vector保存各面部的坐标、大小(用矩形表示)。 函数由分类器对象调用。 函数原型:

void检测多路复用(

恒定市场影像,

cv _输出向量反射对象,

双比例因子=1.1,

int minNeighbors=3,

int flags=0,

Size minSize=Size ()、

Size maxSize=Size (

); 参数1:image提高检查对象图像、通常是灰度图像的检查速度; 参数2:objects被检测物体的矩形框向量组; 参数3:scale factor前后两次连续扫描,表示搜索窗口的比例系数。 默认值为1.1,每个搜索窗口放大10%。 参数4:min neighbors表示构成检测对象的相邻矩形的最小个数。 默认值为3个。 构成检测对象的小矩形的个数和小于min_neighbors - 1的情况除外。 如果min_neighbors为0,则函数不做任何操作,返回所有被检候选矩形框。 这样的设定值通常用于用户定制检查结果的组合程序。 参数5:flags接受缺省值,或使用CV_HAAR_DO_CANNY_PRUNING参数。 如果设置为CV_HAAR_DO_CANNY_PRUNING,函数将使用参数6、7:minSize和manage来排除边过多或过少的区域

四、使用OpenCV的人脸检测函数

opencv源代码的副本有一个文件夹data/haarcascades,其中包含所有opencv的面部检测xml文件。 该文件夹可用于检测由静止图像、视频和照相机获得的图像中的面部。

面部检测器(默认) Haar cascade _ frontal face _ default.XML面部检测器)高速Haar cascade _ frontal face _ alt2. XML面部检测器)侧视ighteye_2splits.XML嘴根检测器) haarcascade_mcs_mouth.xml鼻根检测器)。 ody.xml脸部检测器(高速LBP ) lbpcascade_frontalface.xml首先,下载OpenCV库。

git clone https://github.com/opencv/opencv1.静态面部检测

# #-* -编码: utf-8-* -

# coding=utf-8

导入CV 2

打印('加载. ' ) ) ) )。

opcv _路径=r ' d : /工具/开放/资源'

class fier=cv2.cascade classifier (OPCV _路径' /数据/Haar cascades/Haar cascade _ frontal face _ alt.XML ' )

img=cv2. im读取(' test.jpg ' ) )。

灰色=cv2.cvtcolor (img,cv2.color _ bgr 2灰色) )。

faces=class fier.detect multiscale (灰色,1.2,5 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。

在面上(x,y,w,h ) :

img=cv2.矩阵(img,) x,y ),x w,y h ),255,0,0 ),0 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )但

cv2 .命名窗口(' vik

ings Detected') cv2.imshow('Vikings Detected', img) cv2.waitKey(0)

运行结果:

这里使用的是 haarcascade_frontalface_alt 前脸检测器,测试可发现:

正面检测较好,但侧脸、位置不正检测效果不佳人脸有遮挡时检测效果不佳

这张图的检测结果看得可以更明显:

2. 人眼检测

# -*- coding: utf-8 -*- # coding=utf-8 import cv2 print('loading...') OPCV_PATH = r"D:/tools/opencv/sources" classfier = cv2.CascadeClassifier(OPCV_PATH + "/data/haarcascades/haarcascade_eye.xml") img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = classfier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(5, 5), flags=cv2.CASCADE_SCALE_IMAGE) for (x, y, w, h) in faces: cv2.circle(img, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 2) cv2.namedWindow('Vikings Detected') cv2.imshow('Vikings Detected', img) cv2.waitKey(0)

3. 视频人脸检测

# -*- coding: utf-8 -*- # coding=utf-8 import numpy as np import cv2 OPCV_PATH = r"D:/tools/opencv/sources/data/haarcascades/" # 人脸识别分类器 faceCascade = cv2.CascadeClassifier(OPCV_PATH + 'haarcascade_frontalface_default.xml') # 识别眼睛的分类器 eyeCascade = cv2.CascadeClassifier(OPCV_PATH + 'haarcascade_eye_tree_eyeglasses.xml') # 开启摄像头 cap = cv2.VideoCapture(0) ok = True count = 0 while ok: # 读取摄像头中的图像,ok为是否读取成功的判断参数 ok, img = cap.read() # 转换成灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 人脸检测 faces = faceCascade.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=5, minSize=(32, 32) ) result = [] # 在检测人脸的基础上检测眼睛 for (x, y, w, h) in faces: fac_gray = gray[y: (y + h), x: (x + w)] result = [] eyes = eyeCascade.detectMultiScale(fac_gray, 1.3, 2) # 眼睛坐标的换算,将相对位置换成绝对位置 for (ex, ey, ew, eh) in eyes: result.append((x + ex, y + ey, ew, eh)) # 画矩形 for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) for (ex, ey, ew, eh) in result: cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) cv2.imshow('video', img) if len(result): count += 1 cv2.imwrite('./%s.png' % str(count), img) k = cv2.waitKey(1) if k == 27 or count > 20: # press 'ESC' to quit break cap.release() cv2.destroyAllWindows()

这里检测到即保存图片,图片大于20张程序停止。

4. 从监控摄像头获取图像检测

只需要把上面代码里:

cap = cv2.VideoCapture(url)

VideoCapture的参数改为rtsp地址。另外网络情况不佳时,需要把视频接收帧存队列、处理帧独立线程,避免解码失败造成程序退出。

总结:以上方式检测仅从原理演示人脸检测,其效果远达不到商业使用的要求。

本文部分图片素材来自互联网,如有侵权请告知,我将立刻予以删除。

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/25839.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。