opencv for java之——人脸检测(face detect)

前言

人脸识别在生活中的使用越来越广泛,从支付宝的人脸解锁到酒店前台的登记入住,从火车站闸机处的人脸/身份证校验到目前手机上大量采用的人脸解锁(有的采用结构光),人脸识别是一个完整的流程,包括:人脸检测、人脸对齐、人脸验证。其中人脸检测是人脸识别系统最基础的功能之一,本人采用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 (此过程省略,不熟悉的可以看我之前的文章,有专门介绍)

opencv for java之——人脸检测(face detect)_第1张图片
工程配置

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的前置摄像头,实时检测人脸。

face_detect.gif

End

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

你可能感兴趣的:(opencv for java之——人脸检测(face detect))