java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )

文章目录

  • 项目感受
  • 项目历程和功能概述
  • 具体实现
    • 增删改查
    • 音乐播放
    • 背景更换
    • 邮件发送
    • 人脸识别
      • 百度AI注册
      • 人脸识别相关类的使用
      • 单个参数的提取
      • 使用opencv调用摄像头录入人脸
      • 其他问题
      • 总体流程图
      • 人脸登录效果展示
  • 百度语音识别

项目感受

自学java也有一段时间了,这是第一次做练习项目整个过程还是比较曲折的,特别是因为基础不牢固,导致很多不必要的问题产生,但总的来说还是收获甚多

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第1张图片

项目历程和功能概述

从最开始,只是想着做一个简单的学生成绩管理系统(实现老师对学生成绩的增删改查操作),所以在1.0版本里面用上了Swing和IO流(IO流主要是实现对数据的保存,因为一开始不会使用数据库,嘻嘻)。。。。。(此处省略一万字)接着使用了数据库进行对学生数据的存储,然后同理实现对账户和密码的存储,从而实现账密登录的功能,紧接着又有了通过邮箱验证的方式来实现邮箱验证注册,然后又通过邮箱实现了 “找回密码” 的功能,接着就是对学生信息的各种增删改查和具体内容完善,加入了音乐播放背景更换语音信息提示登录端口选择(学生端和教师端),以及人脸识别登录

具体实现

增删改查

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第2张图片

这些功能方面我用的是mysql,具体的相关内容我就不多介绍了,相关的博客和书籍都很多

音乐播放

package pack2;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.*;

//继承自线程类Thread
public class AudioPlayer extends Thread{
    Player player;
    File music;

    //构造方法
    public AudioPlayer(File file) {
        this.music = file;
    }
    //重写run方法
    @Override
    public void run() {
        super.run();
        try {
            play();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (JavaLayerException e) {
            e.printStackTrace();
        }
    }
    //播放方法
    public void play() throws FileNotFoundException, JavaLayerException {

        BufferedInputStream buffer =
                new BufferedInputStream(new FileInputStream(music));
        player = new Player(buffer);
        player.play();
    }


}

这里需要添加一个jar包 --> jl1.0.jar
或者添加依赖(maven工程)

		<dependency>
        <groupId>javazoom</groupId>
        <artifactId>jlayer</artifactId>
        <version>1.0.1</version>
        </dependency>

还有其他很多很棒的方法,在此推荐博客–>“Java 播放MP3”

背景更换

思路如下:
先new一个分层面板,将背景图装入一个新的面板中,再设置好你需要的组件,最后将装背景的面板放在分层面板最下面,其他组件都放置其上即可

这部分代码如下:

		//设置 “分层” 面板
        jdp = new JLayeredPane();

        //设置背景图片
        panel_back_m = createPanel(0,0,760,540,"D:\\java2\\src\\main\\java\\main_back_lawn.jpg");     
        jdp.add(panel_back_m,10);    //背景图装入“下”层


		jdp.add(menuBar,20,0);       //其他组件装入“上”层
        jdp.add(label,20,0);
        jdp.add(Js,20,0);
        jdp.add(jb_cancel,20,0);
        jdp.add(jb_updatep,20,0);  



	private static JPanel createPanel(int x,int y,int width,int height,String text)
    {
        panel_bac_m = new JPanel(null);

        panel_bac_m.setBounds(x,y,width,height);

        panel_bac_m.setOpaque(true);

        //创建一个ImageIcon
        back_grd_m = new ImageIcon(text);

        //创建一个JLabel,并把ImageIcon加到JLabel中
        JLabel label = new JLabel(back_grd_m);
        label.setSize(width,height);

        //最后把JLabel加入到面板中
        panel_bac_m.add(label,-1);

        return panel_bac_m;
    }     

具体效果:
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第3张图片

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第4张图片
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第5张图片

邮件发送

这里我利用了邮件发送来实现注册时的验证和用邮件找回账户和密码

验证注册效果如下:
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第6张图片
“忘记密码”效果如下:
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第7张图片
具体思路:
利用java随机数[Random()]产生一个4位数,编辑进我的邮件内容,点击按钮时,监听器获取到随机数并判断文本框中输入的内容与get到的随机数是否一致来实现验证,至于“忘记密码”方面,就直接从数据库中获取对应的邮箱的其他信息就OK

这里需要用到一个javamail的jar包
或者添加依赖

		<dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>

具体的注册步骤我就不赘述了,因为已经有很多相关的博客了,大家可以直接在CSDN中搜索“java发送邮件”即可,关于代码部分,我也搜索过很多相关代码,但大都存在一点小问题没解决(主要是我太菜!),所以附上本人代码,希望对你有所帮助(这段代码有借鉴,但是由于搜索太多,忘记出处,还希望作者大大原谅,嘻嘻)

代码如下:

package pack2;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
import java.util.Properties;
import java.util.Random;

public class letter_box {
    public static String myEmailAccount = "你自己的邮箱号,可以是微博的,也可以是网易163的";
    public static String myEmailPassword = "对应的stmp授权码";     

    // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
    // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
    public static String myEmailSMTPHost = "smtp.sina.cn";

    // 收件人邮箱(替换为自己知道的有效邮箱)
    public static String receiveMailAccount;
       
    private static Integer result;     //随机数
    private static String res_ult;     //随机数对应字符串

    private static Session session;

    //数据库相关变量
    private static Connection cen;
    private static PreparedStatement prmen;
    private static ResultSet rls;

    //获取注册信息中的账户,密码和选择
    private static String user,pass,select;

	//点击按钮监听器时调用此方法获取验证码
    public static String  getResult() {
    	//将随机数转为字符串
        res_ult = Integer.toString(result);
        return res_ult;
    }

    public void let_box()throws Exception
    {
        same_part();

        //先从输入邮箱处获取邮箱号码
        receiveMailAccount = new Gradation().getbox();

        // 3. 创建一封邮件
        MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();

        // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
        //
        // PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
        //  仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
        //  类型到对应邮件服务器的帮助网站上查看具体失败原因。
        //
        // PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
        //  (1) 邮箱没有开启 SMTP 服务;
        //  (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
        //  (3) 邮箱服务器要求必须要使用 SSL 安全连接;
        //  (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
        //  (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
        //
        // PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
        transport.connect(myEmailAccount, myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }

    // 忘记密码的邮件操作
    public void for_get_password() throws Exception
    {

        same_part();

        forget_frame fg = new forget_frame();
        receiveMailAccount = fg.getjT_for().getText();

        // 3. 创建一封邮件
        MimeMessage message = createMimeMessage_2(session, myEmailAccount, receiveMailAccount);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();

        // PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
        transport.connect(myEmailAccount, myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }


    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
        message.setFrom(new InternetAddress(sendMail, "LS工作室", "UTF-8"));

        // 3. To: 收件人(可以增加多个收件人、抄送、密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));

        // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
        message.setSubject("信息验证", "UTF-8");

        result = new Random().nextInt(9000)+1000;

        // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
        message.setContent("您的验证码为:"+result +"   请于两分钟内在页面填写验证码完成验证【如非本人操作,请忽略此邮件】", "text/html;charset=UTF-8");


        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }

    public static MimeMessage createMimeMessage_2(Session session, String sendMail, String receiveMail) throws Exception
    {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
        message.setFrom(new InternetAddress(sendMail, "LS工作室", "UTF-8"));

        // 3. To: 收件人(可以增加多个收件人、抄送、密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));

        // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
        message.setSubject("密码查询", "UTF-8");

        //从数据库中获取对应邮箱号码的账户,密码和选择端
        get_info_userall();

        // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
        message.setContent("您的账号为:"+user+"\n您的密码为:"+pass+"\n您的端口为:"+select, "text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }

    public void same_part()
    {
        Properties props = new Properties();   // 参数配置
        props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");  // 需要请求认证

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        session = Session.getDefaultInstance(props);
        session.setDebug(true);     // 设置为debug模式, 可以查看详细的发送 log

    }

    public static void get_info_userall()
    {
        try
        {
            Gradation grad_6 = new Gradation();
            cen = grad_6.getConnection();      //连接数据库

            //首先查询数据库中是否有所要学生的信息
            prmen = cen.prepareStatement("select user_name,pass_word,rgs_choose from register where letter_box = ?");
            prmen.setString(1,receiveMailAccount);
            rls = prmen.executeQuery();

            if(rls.next())
            {
                user = rls.getString("user_name");
                pass = rls.getString("pass_word");
                select = rls.getString("rgs_choose");
            }

        }
        catch (Exception exb)
        {
            exb.printStackTrace();
        }


    }
}

为方便理解,附上关于注册的数据库信息
在这里插入图片描述

人脸识别

前面的说完了,终于到了本篇文章最有技术含量的地方了,不过主要还是百度大大有技术

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第8张图片

百度AI注册

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第9张图片
(我是一条分割线)-------------------------------------------------------------------

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第10张图片
(我又是一条分割线)-------------------------------------------------------------------

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第11张图片
记录好自己的这三个信息,一会儿需要用到
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第12张图片

人脸识别相关类的使用

接着你需要充分的阅读百度为你提供的技术文档
网址–> 人脸库管理说明文档

里面都有对应的示例,请求参数,返回参数等你所需要的信息
本人的项目使用了说明文档里提供的“人脸注册”和“人脸搜索”两个类和四个所需工具类FileUtil,Base64Util,HttpUtil,GsonUtils,当然还要必不可少的AuthService类来获取你的Access Token参数

四个工具类直接通过网址获得:

* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3

添加GsonUtils工具类后需要添加一个依赖,如下:

		<dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>

以下是本人“人脸搜索”类(注意注释内容

package com.baidu.ai.aip.utils;

import AuthService.AuthService;
import com.baidu.ai.aip.utils.HttpUtil;
import com.baidu.ai.aip.utils.GsonUtils;
import com.besjon.pojo.JsonRootBean;
import com.besjon.pojo.User_list;
import org.opencv.face.Face;
import pack2.FaceVideo;
import pack2.FaceVideo_Deng;

import java.io.File;
import java.util.*;


/**
* 人脸搜索
*/
public class FaceSearch {

    /**
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */

    private static String select;
    private static Double score;
    private static Integer num;

    public static Double getScore() {
        return score;
    }

    public static String getSelect() {
        return select;
    }

    public static String faceSearch(String filepath) {
        // 请求url
        File file = new File(filepath);
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/search";
        try {
            Map<String, Object> map = new HashMap<>();
            map.put("image", Base64Util.encode(FileUtil.readFileByBytes(filepath)));   //按照百度文档做相应修改
            map.put("liveness_control", "NONE");    //可改为不需要活体检测
            map.put("group_id_list", "group_1");    //用户组名自己定义
            map.put("image_type", "BASE64");        //按照百度文档做相应修改
            map.put("quality_control", "LOW");

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = AuthService.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args)
    {
		//以下是本人项目中代码,暂时可以不用管
        num = FaceVideo_Deng.getNum_Deng();
        String resultjson = FaceSearch.faceSearch("D:\\Documents\\Pictures\\"+num+".jpg");

        JsonRootBean rootBean = GsonUtils.fromJson(resultjson,JsonRootBean.class);
        User_list list = rootBean.result.user_list[0];

        select = list.getUser_info();
        score = list.getScore();

    }
}

接着是“人脸注册”类(相关参数变更同上面的注释

package com.baidu.ai.aip.utils;

import AuthService.AuthService;
import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;
import com.baidu.ai.aip.utils.GsonUtils;
import pack2.FaceVideo;
import pack2.face_regis_frame;

import java.io.File;
import java.util.*;

/**
 * 人脸注册
 */
public class FaceAdd {

    /**
     * 重要提示代码中所需工具类
     * FileUtil,Base64Util,HttpUtil,GsonUtils请从
     * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
     * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
     * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
     * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
     * 下载
     */
    private static String user_id,user_info;


    public static String add(String filepath) {

        //获取face_regis_frame中的信息传入百度人脸库
        user_id = face_regis_frame.getjTextField();
        user_info = face_regis_frame.getjComboBox();

        // 请求url
        File file = new File(filepath);
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add";
        try {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("image", Base64Util.encode(FileUtil.readFileByBytes(filepath)));
            map.put("group_id", "group_1");
            map.put("user_id", user_id);
            map.put("user_info", user_info);
            map.put("liveness_control", "NONE");
            map.put("image_type", "BASE64");
            map.put("quality_control", "LOW");

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = AuthService.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {

		//本人项目所需,暂时不用管
        int num = FaceVideo.getNum_regis();

        FaceAdd.add("D:\\Documents\\Pictures\\"+num+".jpg");

    }
}

一切准备就绪,你会发现当你运行程序的时候,获取的内容都是类似于这样的

{
“face_token”: “2fa64a88a9d5118916f9a303782a97d3”,
“location”: {
“left”: 117,
“top”: 131,
“width”: 172,
“height”: 170,
“rotation”: 4
}
}

或者这样的

{
“face_token”: “fid”,
“user_list”: [
{
“group_id” : “test1”,
“user_id”: “u333333”,
“user_info”: “Test User”,
“score”: 99.3
}
]
}

都是一大串一大串的,但是我们想获取的信息只是其中某一个啊(比如本人就是只想获取其中的score结果,从而判断是否大于90,来实现人脸识别登录)

单个参数的提取

json的提取方式有很多,在此本人只提供一个方式(也有很多简单的方法,由于本人还未正式学习json相关,所以暂时先记录此方法)

以下提供一个相关网站可以解决这个问题:
在线JSON字符串转Java实体类(JavaBean)

你只需要将你在控制台输出的一大串一大串的结果复制粘贴到此网站,然后点击下载即可

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第13张图片
然后将你下载到的类都存入到新建的项目package里

接着要先将Result类改为如下图所示的样子:
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第14张图片
然后还要修改User_list类中的score的类型(改为Double,因为我们获取的score就是Double类型,不信就看下面的控制台输出图):

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第15张图片

这时在“人脸搜索”类的main方法中写入以下内容即可(输入以下代码时,应该会有报错,编译器会让你把Result类中的user_list以及JsonRootBean类中的result改为public,只需要根据提示照做就行):

 		// 后面的图片文件改为你自己的图片文件,不用管我的代码
		String resultjson = FaceSearch.faceSearch("D:\\Documents\\Pictures\\"+num+".jpg");

        JsonRootBean rootBean = GsonUtils.fromJson(resultjson,JsonRootBean.class);
        User_list list = rootBean.result.user_list[0];
        
        System.out.println("端口选择信息"+list.getUser_info());
        System.out.println("匹配信息"+list.getScore());

然后你就可以看到控制台输出如下:

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第16张图片

这样我们就获取到了我们想要的信息了

使用opencv调用摄像头录入人脸

这里本人主要是用opencv来调用摄像头识别并录入人脸,然后将图片存入对应文件夹

代码如下:

package pack2;

import com.baidu.ai.aip.utils.FaceSearch;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.opencv.videoio.Videoio;

import java.util.Arrays;
import java.util.Random;

/**
 *
 * @Title: Opencv 图片人脸识别、实时摄像头人脸识别、视频文件人脸识别
 * @Description: OpenCV-4.1.1 测试文件
 * @version: V-1.0.0
 *
 */
public class FaceVideo {

    private static Integer num;    //生成随机数,成为录入图片编号

    // 初始化人脸探测器
    static CascadeClassifier faceDetector;   //CascadeClassifier是Opencv中做人脸检测的时候的一个级联分类器,有两种选择:
    // 一是使用老版本的CvHaarClassifierCascade函数,
    // 一是使用新版本的CascadeClassifier类

    static int i=0;

    static
    {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        faceDetector = new CascadeClassifier("E:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
    }

    public static Integer getNum_regis() {
        return num;
    }

    /**
     * OpenCV-4.1.1 从摄像头实时读取
     * @return: void
     */
    public static void getVideoFromCamera_regis() {
        //1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0
        VideoCapture capture=new VideoCapture(0);
        Mat video=new Mat();
        int index=0;
        if (capture.isOpened()) {
            while(i<3) {// 匹配成功3次退出
                capture.read(video);
                HighGui.imshow("实时人脸识别", getFace_regis(video));

                index=HighGui.waitKey(100);
                if (index==27) {
                    capture.release();
                    break;
                }
            }

        }else{
            System.out.println("摄像头未开启");
        }
        try {
            capture.release();
            Thread.sleep(1000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * OpenCV-4.1.1 人脸识别
     * @param image 待处理Mat图片(视频中的某一帧)
     * @return 处理后的图片

     */
    public static Mat getFace_regis(Mat image) {
        // 1 读取OpenCV自带的人脸识别特征XML文件(faceDetector)
//        CascadeClassifier facebook=new CascadeClassifier("D:\\Sofeware\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        // 2  特征匹配类
        MatOfRect face = new MatOfRect();
        // 3 特征匹配
        faceDetector.detectMultiScale(image, face);
        Rect[] rects=face.toArray();
        System.out.println("匹配到 "+rects.length+" 个人脸");
        if(rects != null && rects.length >= 1) {

            // 4 为每张识别到的人脸画一个圈
            for (int i = 0; i < rects.length; i++) {
                Imgproc.rectangle(image, new Point(rects[i].x, rects[i].y), new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height), new Scalar(0, 255, 0));
                Imgproc.putText(image, "Human", new Point(rects[i].x, rects[i].y), Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, new Scalar(0, 255, 0), 1, Imgproc.LINE_AA, false);
                //Mat dst=image.clone();
                //Imgproc.resize(image, image, new Size(300,300));
            }
            i++;
            if(i==3) {// 获取匹配成功第10次的照片

                // [1,100)
                num = (int)(Math.random() * 99) + 1;
                Imgcodecs.imwrite("D:\\Documents\\Pictures\\" + num +".jpg", image);    
            }
        }
        return image;
    }

}

以上代码是人脸注册时候的摄像头调用,人脸登录时候的摄像头调用同理可得

但是这里有一个需要注意的点就是,要先编辑启动类:Edit Configuration VM options:-Djava.library.path=E:\opencv\build\java\x64; (路径要改为你自己的opencv文件路径

第一步:

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第17张图片
第二步:

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第18张图片

使用opencv调用摄像头的依赖:

		<dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>4.1-1.4.4</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.4.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platform -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>4.1-1.4.4</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>


        <!-- 视频摄像头 -->
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.4.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv-platform</artifactId>
            <version>4.0.1-1.4.4</version>
        </dependency>

其他问题

除此之外,在项目搭建时发现,每次改动过maven的依赖后,有些地方就会报错,比如@Override和JComboBox<>都不能识别,经过查询后发现是因为每次我更改maven依赖后,jdk就会改为默认的1.5,只要添加以下依赖就可以解决这个问题:

	<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

改过后:

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第19张图片

总体流程图

最后附上整体流程图
java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第20张图片

人脸登录效果展示

这一切都准备就绪后,我们就可以实现人脸登录了

首先录入帅气的钢铁侠

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第21张图片
接着录入冷酷的黑豹

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第22张图片

然后录入丑陋的我(各位大哥将就看吧,手机的图片呈现效果不好,为了比较还是拍一张真实人脸)

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第23张图片
存入完成,我们可以看到百度的人脸库里已经存入我们三个的人脸信息

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第24张图片

现在测试人脸登录

首先我用一张胡歌的照片登录(非存入人员)

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第25张图片
接着我自己进行登录(已存入人员)

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第26张图片
最后我用一张钢铁侠的其他照片登录(已录入人员)

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第27张图片
其实在此项目之前,我一直是直接传入两张本地图片(很清晰的那种),百度AI返还回来的参数很准确,如果是同一个人的两张不同图片,返回结果基本是90 - 99(满分匹配为100),不同的人返回的结果基本都是5 - 25,就算是找两个比较像的人,返回结果也在50 - 75范围里,由于本人的电脑摄像头像素不高,可能会影响结果,但是在这么多次的测试中,也基本没出现什么问题,总的来说,百度牛逼!

奉上这几天测试结果中匹配度最高的两个人(70)

java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )_第28张图片

百度语音识别

后期更新博客,请移步:java+百度语音识别(语音助手)

你可能感兴趣的:(java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 ))