opencv for java之——人脸检测(face dete
2018-08-27 本文已影响164人
侠之大者_7d3f
前言
人脸识别在生活中的使用越来越广泛,从支付宝的人脸解锁到酒店前台的登记入住,从火车站闸机处的人脸/身份证校验到目前手机上大量采用的人脸解锁(有的采用结构光),人脸识别是一个完整的流程,包括:人脸检测、人脸对齐、人脸验证。其中人脸检测是人脸识别系统最基础的功能之一,本人采用opencv+java的方式实现基础的人脸检测。
开发环境
- windows 10 (x64)
- opencv3.4.2
- IntellJ IDEA
人脸检测原理简介
目前人脸检测算法主要分为基于深度学习的和传统的人脸检测算法,基于深度学习的算法检测精度高,但是计算量大,基于传统算法的人脸识别(例如Haar特征+级联分类器)速度快,但是准确度有所欠缺。
本文采用基于传统方法的人脸检测——Haar特征+Cascade级联分类器,Cascade分类器是opencv中基本的分类器之一。
人脸检测,人脸对齐,人脸识别之间的关系
算法 | 原理 | 结果 |
---|---|---|
人脸检测 face detect | 采用检测器在整张图像范围内搜索,找出可能是人脸的位置 | 一系类可能包含人脸的矩形框(人脸在哪儿) |
人脸对齐 face alignment | 在人脸检测的基础上,进一步定位五官部位的关键点,根据关键点对人脸进一步矫正和归一化 | 矫正和归一化的人脸(人脸摆正) |
人脸验证 face recognize | 将待验证的人脸与人脸数据库的对比 | 判断人脸所代表的身份信息(这张人脸是谁) |
人脸检测工程
1. IntellJ IDEA配置opencv (此过程省略,不熟悉的可以看我之前的文章,有专门介绍)

2. 编写Java代码
注意:lbpcascade_frontalface_improved.xml 模型文件在opencv的安装路径中自带
package com.sty;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import static org.opencv.core.CvType.CV_8UC1;
import static org.opencv.core.CvType.CV_8UC3;
import static org.opencv.imgproc.Imgproc.COLOR_BGR2GRAY;
import static org.opencv.imgproc.Imgproc.cvtColor;
import static org.opencv.imgproc.Imgproc.rectangle;
import static org.opencv.videoio.Videoio.CAP_PROP_FPS;
import static org.opencv.videoio.Videoio.CAP_PROP_FRAME_HEIGHT;
import static org.opencv.videoio.Videoio.CAP_PROP_FRAME_WIDTH;
/**
* @description 基于opencv Haar分类器的人脸检测
* @author weiPenghui
* @date 2018-8-27
*/
public class Main {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args){
String xmlFileName = "D:\\opencv3.4.2\\build\\etc\\lbpcascades\\lbpcascade_frontalface_improved.xml";
CascadeClassifier cascadeClassifier = new CascadeClassifier(xmlFileName);
if (cascadeClassifier.empty()){
System.out.println("加载xml模型文件失败!");
}else{
VideoCapture capture = new VideoCapture(0);
if (!capture.isOpened()){
System.out.println("打开相机失败!");
}else{
//设置相机参数
capture.set(CAP_PROP_FRAME_WIDTH,640);
capture.set(CAP_PROP_FRAME_HEIGHT,480);
capture.set(CAP_PROP_FPS,30);
Mat frame = new Mat(new Size(640,480),CV_8UC3);
Mat frameGray = new Mat(new Size(640,480),CV_8UC1);
MatOfRect objectsRect = new MatOfRect();
while (true){
//读取图像
if(!capture.read(frame)){
System.out.println("读取相机数据失败!");
break;
}
//转为灰度
cvtColor(frame,frameGray,COLOR_BGR2GRAY);
//人脸检测
cascadeClassifier.detectMultiScale(frameGray,objectsRect);
if (!objectsRect.empty()){
//绘制矩形
Rect[] rects = objectsRect.toArray();
for (Rect r:rects){
rectangle(frame,r.tl(),r.br(),new Scalar(0,255,255),2);
}
System.out.println("检测到人脸个数="+rects.length);
}
//显示
HighGui.imshow("facedetect",frame);
if (HighGui.waitKey(33)=='q'){
break;
}
}
}
}
}
}
3. 运行结果
代码自动打开PC的前置摄像头,实时检测人脸。

End
基于opencv+java实现了简单的人脸检测,感谢甜心的支持,以后还讲探索性能更好的基于深度学习的人脸检测算法,喜欢的小伙伴请点赞支持。