使用openCV进行视频人脸识别

视频人脸识别系列

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



前言

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


一、环境搭建

开发环境

  • 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;

在这里插入图片描述

设置 maven 阿里源

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

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

<?xml version="1.0" encoding="UTF-8"?>
<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>aliyunmaven</id>
	  <mirrorOf>*</mirrorOf>
	  <name>阿里云公共仓库</name>
	  <url>https://maven.aliyun.com/repository/public</url>
	</mirror>
  </mirrors>

</settings>

IDEA 配置 JDK 和 MAVEN
  • 在 IDEA 的 setting… 中搜索 maven 配置 maven 目录和设置的阿里源配置文件
    在这里插入图片描述
  • 选择 Maven 下的 Importing 指定 jdk
    在这里插入图片描述
创建maven项目
  • 启动IDEA ,创建 Maven 项目, 勾选"create from archetype" 选择一个快速启动模板(maven-archetype-quickstart);

在这里插入图片描述

  • 填写项目名称 和 包名称
    在这里插入图片描述
  • 选择安装的 maven 和 配置的setting.xml
    在这里插入图片描述
    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.bytedeco</groupId>
   <artifactId>javacv-platform</artifactId>
   <version>1.5.7</version>
   <type>pom</type>
 </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();
                }
            }
        }
    }
}

运行下看到人脸被实时框选了,还请好玩的。在这里插入图片描述


总结

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

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值