java结合opencv进行照片人脸检测

1 篇文章 0 订阅
1 篇文章 0 订阅

前言:

公司前期有图片上传需求,已经满足,然后在此基础上又要求实现人脸检测,这时我懵逼了呀,没做过这呀,这不是难为我吗?我们用的还是H5页面,于是一顿网上查找资料,最终决定使用opencv.

正文:

1 首先导入maven jar包

<dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv-platform</artifactId>
            <version>3.4.1-1.4.1</version>
        </dependency>

2 opencv下载,并将一些文件放置项目

首先需要安装opcv opcv官网下载链接,在这里下载版本要和maven里的版本区别不能太大,我曾经因为版本相差太大,调试了好久才发现这个问题。
下载完之后,进行安装。安装比较简单,直接装就行。

1 获取opencv dll文件,放到到项目里。

根据下方图片找到java需要用到的dll文件,
在这里插入图片描述然后我这里放的位置是web-inf下面,当然也可以放到其他位置,只要能读取到就行。
在这里插入图片描述

2 项目里读取dll文件,并且放到环境变量中。

这里我是放到了filter里,在项目启动的时候就加载。

public class InitOpencv  implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
    public void contextInitialized(ServletContextEvent arg0) {
         // 1 如果服务器装了opencv,则直接用这个就行
        //System.load("D:/opencv/opencv/build/java/x64/opencv_java341.dll");
        
        //2 如果没装 则用此方法
        //获取存放dll文件的绝对路径(假设将dll文件放在系统根目录下的WEB-INF文件夹中)
        String path=arg0.getServletContext().getRealPath("WEB-INF");
        //将此目录添加到系统环境变量中
        addDirToPath(path);
        //加载相应的dll文件,注意要将'\'替换为'/'
        System.load(path.replaceAll("\\\\","/")+"/opencv_java341.dll");
    }

    private void addDirToPath(String s){
        try {
            //获取系统path变量对象
            Field field=ClassLoader.class.getDeclaredField("sys_paths");
            //设置此变量对象可访问
            field.setAccessible(true);
            //获取此变量对象的值
            String[] path=(String[])field.get(null);
            //创建字符串数组,在原来的数组长度上增加一个,用于存放增加的目录
            String[] tem=new String[path.length+1];
            //将原来的path变量复制到tem中
            System.arraycopy(path,0,tem,0,path.length);
            //将增加的目录存入新的变量数组中
            tem[path.length]=s;
            //将增加目录后的数组赋给path变量对象
            field.set(null,tem);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3在web.xml里加入listener
 <listener>
        <listener-class>com.ejoysoft.ecton.web.filter.InitOpencv</listener-class>
    </listener>

2 人脸检测器放置项目里

根据此目录将人脸检测器xml放到项目里,这里我放的位置是资源文件里resources/propertites
在这里插入图片描述

到此,要做的环境准备工作以ok,下面是调用代码:

 @Value("classpath:properties/haarcascade_frontalface_alt.xml")
    private Resource xml;

    public int check(MultipartFile file, HttpServletRequest request,String userNo) {
        try {
            log.info("人脸检测开始……");
            String path = request.getSession().getServletContext().getRealPath("/") + "/static/images/upload/opencv/";
            File targetXmlFile = new File(path + xml.getFilename() + "");
            FileUtils.copyInputStreamToFile(xml.getInputStream(), targetXmlFile);
            CascadeClassifier faceDetector = new CascadeClassifier(targetXmlFile.toString());
            if (faceDetector.empty()) {
                log.info("请引入文件……");
                return 0;
            }
            // 创建图片tempFile
           // File tempFile = new File(path + file.getOriginalFilename() + "");
            File tempFile = new File(path + userNo + ".jpg");
            FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
            // 读取创建的图片tempFile
            Mat image = Imgcodecs.imread(tempFile.toString());
            MatOfRect faceDetections = new MatOfRect();
            // 进行人脸检测
            faceDetector.detectMultiScale(image, faceDetections);
            int checkNum = faceDetections.toArray().length;
            log.info("检测到人脸{}",checkNum);
            if (checkNum>0&& tempFile.exists() && tempFile.isFile()) {
                if (tempFile.delete()) {
                    log.info("删除临时文件{}成功!",tempFile);
                }
            }
           // System.out.println(String.format("检测到人脸: %s", faceDetections.toArray().length));
            return checkNum;
        } catch (IOException e) {
            log.info("人脸检测失败{}",e);
            return 0;
        }
    }

在后台图片上传地方,先调用此方法检测照片是否有人脸,如果有进行原先逻辑保存图片,没有检测到返给前端。

在我使用的过程中,有时候检测不是很精确,但是大部分情况下是ok的。

懒人模式:直接去我的主页下载写好的文件也行。直通门

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java OpenCV 人脸识别考勤是一种利用Java语言和OpenCV进行人脸识别的考勤系统。 首先,我们需要在Java中配置OpenCV库并加载相应的依赖OpenCV库提供了很多用于人脸识别的功能和算法,如人脸检测人脸特征提取等。 其次,我们需要采集员工的人脸图像作为模型数据。可以使用摄像头或从已有的照片中获取人脸图像。对于每个员工,我们可以将其人脸图像与其对应的ID进行关联,并将其存储在数据库或文件中。 接下来,我们可以使用OpenCV人脸检测算法对新采集到的人脸图像进行检测。这一步可以通过调用OpenCV库中的人脸检测函数实现。一旦检测人脸,我们可以通过人脸识别算法提取人脸图像的特征,如提取的特征向量。 在考勤过程中,我们可以使用摄像头从员工的每张人脸图像中提取特征,并与模型数据中存储的员工人脸特征进行比对。通过比对,我们可以确定这张人脸图像是否属于已注册的员工。 最后,我们可以根据比对结果判断员工是否已打卡。如果识别到的人脸与已注册员工的人脸匹配成功,则记录员工的出勤时间等信息。否则,说明该人脸不属于已注册的员工,可以进行相应的处理。例如,可以拒绝进入或记录异常情况等。 总之,Java OpenCV 人脸识别考勤系统可以帮助企业实现面部识别考勤功能,提高考勤的准确性和效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖-无恙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值