使用openCV进行视频人脸识别

视频人脸识别系列

第一篇 使用openCV进行视频人脸识别
第二篇 使用虹软SDK进行视频人脸识别
第三篇 使用虹软SDK进行视频人脸比对


文章目录

  • 视频人脸识别系列
  • 前言
  • 一、环境搭建
    • 开发环境
        • 配置环境变量
        • 设置 maven 阿里源
        • IDEA 配置 JDK 和 MAVEN
        • 创建maven项目
  • 二、使用openCV进行视频人脸识别
    • 1.引入 JavaCV 开源库
    • 2.引入官方训练的人脸识别库
    • 3.读取摄像头进行人脸识别框选
  • 总结


前言

后期可能要做视频人脸识别项目,先学习下人脸识别相关的库的基本用法,简单熟悉下使用人脸开源库。


一、环境搭建

开发环境

  • javaJdk 11
  • Apache Maven 3.8.4
  • opencv-4.5.5
  • IDEA 2021.3 CE 社区版

下载 java JDK 11、Apache Maven 3.8.4、opencv-4.5.5 到D:\software\目录。

配置环境变量

JAVA_HOME=D:\software\Java\jdk-11.0.6
MAVEN_HOME=D:\software\apache-maven-3.8.4
PATH=.;%JAVA_HOME%\bin;%MAVEN_HOME%\bin;

使用openCV进行视频人脸识别_第1张图片

设置 maven 阿里源

https://developer.aliyun.com/mvn/guide

打开 D:\software\apache-maven-3.8.4\conf\settings.xml 文件 将阿里源添加进 mirrors 中


<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
          
  <mirrors>
  
	<mirror>
	  <id>aliyunmavenid>
	  <mirrorOf>*mirrorOf>
	  <name>阿里云公共仓库name>
	  <url>https://maven.aliyun.com/repository/publicurl>
	mirror>
  mirrors>

settings>

IDEA 配置 JDK 和 MAVEN

  • 在 IDEA 的 setting… 中搜索 maven 配置 maven 目录和设置的阿里源配置文件
    使用openCV进行视频人脸识别_第2张图片
  • 选择 Maven 下的 Importing 指定 jdk
    使用openCV进行视频人脸识别_第3张图片

创建maven项目

  • 启动IDEA ,创建 Maven 项目, 勾选"create from archetype" 选择一个快速启动模板(maven-archetype-quickstart);

使用openCV进行视频人脸识别_第4张图片

  • 填写项目名称 和 包名称
    使用openCV进行视频人脸识别_第5张图片
  • 选择安装的 maven 和 配置的setting.xml
    使用openCV进行视频人脸识别_第6张图片
    Finish 项目创建完成,找到 main方法运行下看到输出 Hello world 说明环境已经成功。

二、使用openCV进行视频人脸识别

1.引入 JavaCV 开源库

javaCV 是一款包装了常用音视频领域库(OpenCV、FFmpeg、libdc1394、FlyCapture等)和实用程序类的java库,采用javaCPP开源库(JNI技术的实现所以支持所有java实现如android)在java中高效访问本地c++的方法。简单的说就是javaCV实现了在java中调用优秀音视频开源库(多为c/c++开发)的桥梁。
https://github.com/bytedeco/javacv

在 pom.xml 中 dependencies 节点 添加 javacv 并安装

<dependencies>
<dependency>
   <groupId>org.bytedecogroupId>
   <artifactId>javacv-platformartifactId>
   <version>1.5.7version>
   <type>pomtype>
 dependency>
<dependencies>

2.引入官方训练的人脸识别库

D:\software\opencv-4.5.5\data\haarcascades\haarcascade_frontalface_alt2.xml
在项目根目录下创建 libs 目录 将 opencv目录下的 haarcascade_frontalface_alt2.xml 文件复制到 libs 下。

3.读取摄像头进行人脸识别框选

package com.sxfenglei;
import org.bytedeco.javacv.*;
import org.bytedeco.opencv.global.opencv_imgproc;
import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.opencv_core.Rect;
import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
import org.opencv.imgproc.Imgproc;
import javax.swing.*;
public class AppDemo {
    public static void main(String[] args) {
        OpenCVFrameGrabber grabber = null; //帧抓取器
        try{
            //抓取摄像头
            grabber = new OpenCVFrameGrabber(0);
            // grabber.setFrameRate(24);
            grabber.setImageWidth(960);
            grabber.setImageHeight(540);
            grabber.start();
            System.out.println("尝试启动grabber抓取本地摄像头");

            //新建窗口显示视频画面
            CanvasFrame canvasFrame = new CanvasFrame("摄像头");
            canvasFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            canvasFrame.setAlwaysOnTop(true);

            //转换
            OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat();

            //检测器 加载opencv官方训练的人脸识别库
            CascadeClassifier faceCascade = new CascadeClassifier("D:\\javaworks\\faceDemo\\libs\\haarcascade_frontalface_alt2.xml");

            //定义人脸集合
            RectVector faces = new RectVector();

            Frame frame = null;
            //循环读取帧数据
            while (true) {
                if (!canvasFrame.isDisplayable()) {
                    grabber.stop();
                    System.out.println("退出");
                    System.exit(2);
                }

//                 frame = grabber.grabImage();
                frame = grabber.grab();
                Mat mat = converterToMat.convert(frame);
                if(mat.empty()){
                    continue;
                }

                //当前帧进行灰度+直方均衡
                Mat videoMatGray = new Mat();
                opencv_imgproc.cvtColor(mat, videoMatGray, Imgproc.COLOR_BGRA2GRAY);
                opencv_imgproc.equalizeHist(videoMatGray, videoMatGray);

                //把所有人脸数据绘制到图片中
                faceCascade.detectMultiScale(videoMatGray, faces);

                //把所有人脸数据绘制到图片中
                for(int i=0;i<faces.size();i++){
                    Rect face = faces.get(i);
                    opencv_imgproc.rectangle(mat, face, Scalar.RED,1, 8, 0);
                }

                //图片刷新到窗口
                frame = converterToMat.convert(mat);
                canvasFrame.showImage(frame);

            }

        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            if(null != grabber){
                try {
                    grabber.close();
                } catch (FrameGrabber.Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行下看到人脸被实时框选了,还请好玩的。使用openCV进行视频人脸识别_第7张图片


总结

在 java 中使用 javaCV 库 和 openCV 人脸检测库 进行视频人脸实时的检测。在识别人脸的时候不是很准确,有时候不是人脸的地方也会被框选中。

你可能感兴趣的:(java,opencv,音视频,java)