开发者社区> 西关大叔> 正文

OpenCV 实时人脸检测

简介: 目的 试验OpenCV的实时图像捕获 实时窗口内对每一帧的图片进行处理 识别视频窗口内的人脸,并用一个矩形画出来 人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等。
+关注继续查看

目的

  • 试验OpenCV的实时图像捕获
  • 实时窗口内对每一帧的图片进行处理
  • 识别视频窗口内的人脸,并用一个矩形画出来

人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等。

对于opencv的人脸检测方法,有点是简单,快速;存在的问题是人脸检测效果不好。如图3-1所示,正面/垂直/光线较好的人脸,该方法可以检测出来,而侧面/歪斜/光线不好的人脸,无法检测。因此,该方法不适合现场应用。对于dlib人脸检测方法 ,效果好于opencv的方法,但是检测力度也难以达到现场应用标准。

本文中,我们采用了基于深度学习方法的mtcnn人脸检测系统mtcnn人脸检测方法对自然环境中光线,角度和人脸表情变化更具有鲁棒性,人脸检测效果更好;同时,内存消耗不大,可以实现实时人脸检测。本文中采用mtcnn是基于python和tensorflow的实现(代码来自于davidsandberg,caffe实现代码参见:kpzhang93)。mtcnn检测出人脸后,对人脸进行剪切并resize为(96,96,3)作为facenet输入,如图3-3所示。

设计思路:

通过OpenCV打开本机上的摄像头

cameraCapture = cv2.VideoCapture(0)

开始第一帧图像的捕获,这个方法用来测试当前的摄像头是否可用

success, frame = cameraCapture.read()

把我在“OpenCV初步”中讲述的从静态图片中识别人脸的代码提取出来成为一个show_face函数:

def show_faces (img) :
    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.imshow("Camera", img)

如果第一帧图像捕获成功则可以认为本机的摄像头可以,并建立一个无限循环(退出条件为敲击键盘),继续对下一帧图像进行捕获,然后显示到观察窗口上。

while success and cv2.waitKey(1) == -1:
    success, frame = cameraCapture.read()
    show_faces(frame)

以下为本例的全部代码:

# coding=utf-8

import cv2
img_size = 128
face_cascade = cv2.CascadeClassifier(r'./data/haarcascades/haarcascade_frontalface_default.xml')

# 打开摄像头并开始读取画面
cameraCapture = cv2.VideoCapture(0)
success, frame = cameraCapture.read()

def show_faces (img) :
    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.imshow("Camera", img)

while success and cv2.waitKey(1) == -1:
    success, frame = cameraCapture.read()
    show_faces(frame)

cameraCapture.release() # 关闭摄像头
cv2.destroyAllWindows() # 释放所有被打开的窗口资源

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
携程实时智能检测平台建设实践
rophet基本覆盖了携程所有业务线,监控指标的数量达到10K+,覆盖了携程所有订单、支付等重要的业务指标。Prophet将时间序列的数据作为数据输入,以监控平台作为接入对象,以智能告警实现异常的告警功能,并基于Flink实时计算引擎来实现异常的实时预警,提供一站式异常检测解决方案。
5152 0
定时检测服务状态脚本实现
1、定时监测服务状态需求
48 0
【OpenCV学习】角点检测
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ #include #include "cv.h" #include "highgui.h" #define MAX_CORNERS 100 int main(void) { int...
501 0
【OpenCV学习】基于轮廓寻找的视频流运动检测
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ #include "cv.h" #include "highgui.h" #include #include #include #include #include // vari...
646 0
+关注
西关大叔
近二十年软件开发、项目管理、团队建设和管理经验。致力于互联网技术应用与大数据应用方面的研究与开发工作。曾任多家软件公司的高级软件工程师、项目经理、首席架构师和技术总监等职务。现任广州市增增智能科技有限公司CEO,从事视觉智能、语音智能及IoT等技术的产品研发与企业经营方面的工作
52
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载