java实现opencv人脸识别(二)

Java下使用opencv进行人脸检测

工作需要,研究下人脸识别,发现opencv比较常用,尽管能检测人脸,但识别率不高,多数是用来获取摄像头的视频流的,提取里面的视频帧,实现人脸识别时通常会和其他框架搭配使用,比如face_recognition、SeetaFace Engine、Facenet。不过这里先简单介绍下opencv在java下的使用(网上大多都是C++的demo,这里是使用其java接口,还提供了python的接口)。

这里简单说下opencv(版本为340)的安装

    window下直接运行opencv-3.4.0-vc14_vc15.exe即可,java下用到的只有里面的opencv-340.jar和opencv_java340.dll,官网下载或者直接下载java部分。
   1、 将build\java\opencv-340.jar导入到项目中,
   2、 根据操作系统版本,将build\java\x64\opencv_java340.dll放在%JAVA_HONE%\bin下(这里只要放在System.getProperty("java.library.path")下目录即可)。
   3、 在代码中使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME);加载。

在sources\data下都是模型文件,opencv使用这些xml建模(CascadeClassifier)分析人脸,这里只用到haar下的正脸和人眼模型文件。

下面的demo修改自网上的例子,原为单独检测人脸,发现会将只有鼻子的部分也识别为人脸,所以修改为使用两个CascadeClassifier同时检测人脸和人眼,同时存在才确认为人脸目标,提高准确率,不过识别的时间较原来的长。
Demo

package opencv;

import org.opencv.core.*;
import org.opencv.core.Point;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Random;

public class MyDemo extends JPanel {
    private BufferedImage mImg;

    /**
     * 转换图像
     * @param mat
     * @return
     */
    private BufferedImage mat2BI(Mat mat){
        int dataSize = mat.cols()*mat.rows()*(int)mat.elemSize();
        byte[] data = new byte[dataSize];
        mat.get(0, 0,data);

        int type = mat.channels()==1? BufferedImage.TYPE_BYTE_GRAY:BufferedImage.TYPE_3BYTE_BGR;
        if(type == BufferedImage.TYPE_3BYTE_BGR){
            for(int i=0;i<dataSize;i+=3){
                byte blue=data[i+0];
                data[i+0]=data[i+2];
                data[i+2]=blue;
            }
        }
        BufferedImage image=new BufferedImage(mat.cols(),mat.rows(),type);
        image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);

        return image;
    }

    @Override
    public void paint(Graphics g){
        if(mImg!=null){
            g.drawImage(mImg, 0, 0, mImg.getWidth(),mImg.getHeight(),this);
        }
    }


    /**
     * opencv实现人脸识别,同时检测到人脸和人眼时才截图
     * @param img
     */
    public static Mat detectFace(Mat img) {

        System.out.println("Running DetectFace ... ");
        // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
        CascadeClassifier faceDetector = new CascadeClassifier("C:\\env\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        CascadeClassifier eyeDetector = new CascadeClassifier("C:\\env\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml");


        // 在图片中检测人脸
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(img, faceDetections);

        //System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));

        Rect[] rects = faceDetections.toArray();
        Random r = new Random();
        if(rects != null && rects.length >= 1){
            for (Rect rect : rects) {

                //画矩形
                Imgproc.rectangle(img, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                        new Scalar(0, 0, 255), 2);
//                Imgproc.circle(img, new Point(rect.x + rect.width, rect.y + rect.height), cvRound((rect.width + rect.height) * 0.25),
//                        new Scalar(0, 0, 255), 2);

                //识别人眼
                Mat faceROI = new Mat(img, rect );
                MatOfRect eyesDetections = new MatOfRect();
                eyeDetector.detectMultiScale( faceROI, eyesDetections);
                System.out.println("Running DetectEye ... "+ eyesDetections);

                if( eyesDetections.toArray().length > 1){
                    save(img, rect, "C:\\Users\\TR\\Desktop\\demo\\test\\"+r.nextInt(2000)+".jpg");
                }

            }
        }
        return img;
    }

    /**
     * opencv将人脸进行截图并保存
     * @param img
     */
    private static void save(Mat img, Rect rect, String outFile){
        Mat sub = img.submat(rect);
        Mat mat = new Mat();
        Size size = new Size(300, 300);
        Imgproc.resize(sub, mat, size);
        Imgcodecs.imwrite(outFile, mat);
    }


    public static void main(String[] args) {
        try{
            //加载opencv库
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

            //获取摄像头视频流
            VideoCapture capture = new VideoCapture(0);
            int height = (int)capture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
            int width = (int)capture.get(Videoio.CAP_PROP_FRAME_WIDTH);
            if(height == 0||width == 0){
                throw new Exception("camera not found!");
            }

            //使用Swing生成GUI
            JFrame frame = new JFrame("camera");
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            MyDemo panel = new MyDemo();
            frame.setContentPane(panel);
            frame.setVisible(true);
            frame.setSize(width+frame.getInsets().left+frame.getInsets().right,
                    height+frame.getInsets().top+frame.getInsets().bottom);

            Mat capImg = new Mat();
            Mat temp=new Mat();
            //Random r = new Random();
            while(frame.isShowing()){
                //获取视频帧
                capture.read(capImg);
                //转换为灰度图
                Imgproc.cvtColor(capImg, temp, Imgproc.COLOR_RGB2GRAY);
                //识别人脸
                Mat image = detectFace(capImg);
                //转为图像显示
                panel.mImg = panel.mat2BI(image);
                panel.repaint();
            }
            capture.release();
            frame.dispose();

        }catch(Exception e){
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            System.out.println(sw.toString());
        }
        finally{
            System.out.println("Exit");
        }

    }

}
---------------------
作者:Cceking
来源:CSDN
原文:https://blog.csdn.net/cceking/article/details/80868314
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Java调用OpenCV实现人脸识别考勤的步骤如下: 1. 安装OpenCV库:在Java项目中引入OpenCV库,可以使用Maven或手动下载并导入。 2. 加载人脸识别模型:使用OpenCV提供的CascadeClassifier类加载人脸识别模型,该模型可以从OpenCV官网下载。 3. 读取图片或视频:使用OpenCV提供的VideoCapture类读取图片或视频。 4. 人脸检测:使用CascadeClassifier类的detectMultiScale方法进行人脸检测,返回检测到的人脸位置。 5. 人脸识别:使用OpenCV提供的LBPHFaceRecognizer类进行人脸识别,该类需要训练数据集和测试数据集。 6. 考勤记录:根据人脸识别结果进行考勤记录,可以将记录保存到数据库或文件中。 以上是Java调用OpenCV实现人脸识别考勤的基本步骤,具体实现需要根据具体需求进行调整和优化。 ### 回答2: Java调用OpenCV人脸识别考勤可以在人力资源管理、安保管理等领域广泛应用。下面我来和大家分享一下如何进行Java调用OpenCV人脸识别考勤。 1. 首先,我们需要安装OpenCV库。OpenCV是一个开源的计算机视觉库,可用于图像处理、计算机视觉和机器学习等相关应用。我们可以从OpenCV的官网上下载最新版本的库,并按照安装指引逐步进行安装。 2. 接着,我们需要在Java中引用OpenCV库。我们可以在Java代码中添加OpenCV库的路径,或者将OpenCV库打包成Jar文件,并在项目中引用该Jar文件。 3. 然后,我们需要进行人脸识别的数据收集和预处理。首先,我们需要收集一定数量的人脸数据,并进行预处理,如实现数据的裁剪、缩放和灰度变换等,以提高人脸识别的准确性。 4. 接下来,我们需要训练模型。使用OpenCV人脸识别算法,对收集到的人脸数据进行训练,以建立一套人脸识别模型。通过对收集到的图片进行逐一比对,可以判断目标人物是否在图片中,并进行相关处理。 5. 最后,我们需要将人脸识别考勤应用到实际场景中。在建立好人脸识别模型后,我们可以在Java程序中调用该模型,通过摄像头捕捉人脸图像,并进行人脸匹配,判断目标人物是否在考勤范围中,并进行相关考勤记录处理。 总而言之,Java调用OpenCV人脸识别考勤需要进行许多数据处理和算法训练。但是,一旦建立好相关模型和程序框架,就可以在相应的场景中大大提高人力资源管理、安保管理等方面的工作效率。 ### 回答3: Java调用opencv人脸识别考勤是一种利用计算机视觉技术进行考勤的方法。在此过程中,Java作为程序编程语言,而opencv则是计算机视觉库。人脸识别技术是一种验证身份的方式,基于面部特征对人进行识别,其应用已被广泛使用在图像和视频处理中。 在进行java调用opencv人脸识别考勤时,需要进行以下步骤: 1.安装和配置opencv库:首先,需要安装opencv库,这可以通过官方网站下载进行实现。然后需要将opencv库和java的开发工具进行关联和配置。 2.图像的采集和处理:考勤系统需要对员工进行面部识别。这需要安装相应摄像头和采集图像。Java调用opencv库中的图像处理函数进行图像的处理和人脸特征的分析和提取。 3.人脸识别:这是实现考勤的核心部分。Java调用opencv库中的人脸识别算法和识别器完成对人脸的特征提取和人脸识别。此外,也需要完成对数据模型和识别算法的训练和调优。 4.考勤结果输出:最后,Java调用opencv库中的数据输出函数生成考勤结果。这些结果可以在考勤管理系统中进行保存和使用。 通过java调用opencv人脸识别技术进行考勤,可以更快、更准确地对员工进行识别,避免迟到早退等问题。这种方法也节省了人力成本,提高了公司的工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值