基於JavaCV的人臉識別、人臉匹配

這裏使用的是JavaCV的人臉識別、人臉匹配部分:
代碼中的註釋寫的比較清楚了,就不多解釋了。

package com.bank.demo.face;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import static org.bytedeco.javacpp.opencv_core.*;
import java.nio.IntBuffer;
import java.nio.charset.StandardCharsets;

import org.bytedeco.javacv.FrameGrabber.Exception;

import javax.swing.*;
import java.io.*;
import static org.bytedeco.javacpp.opencv_core.CV_32SC1;
import static org.bytedeco.javacpp.opencv_imgproc.*;

/**
 * @author bank
 * @date 2020/4/18 23:09
 */
public class faceRecognize {
    public boolean faceRecognize(String name) {
        //CSV文件
        File file=new File("D:\\ORL\\csv.txt");
        int testtimes=0,showtimes=0;
        try {
            if(!file.exists()){
                System.out.println("沒有找到CSV文件");
                System.exit(0);
            }
            //讀取CSV文件
            BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
            String line=null;
            //圖片保存,對應訓練樣本數
            MatVector images=new MatVector(410);
            //設置標籤值,對應樣本數
            opencv_core.Mat lables=new opencv_core.Mat(410,1,CV_32SC1);
            IntBuffer lablesBuf=lables.createBuffer();
            int num=0;//用於打上標籤
            while ((line=reader.readLine())!=null){
                String[] split = line.split(";");
                String picPath=split[0];
                int lable=Integer.valueOf(split[1]);
                //放入圖片
                images.put(num,opencv_imgcodecs.imread(picPath,0));
                //放入標籤
                lablesBuf.put(num,lable);
                num++;
            }

            //創建分類器
            opencv_face.FisherFaceRecognizer fisherFaceRecognizer= opencv_face.FisherFaceRecognizer.create();
            fisherFaceRecognizer.train(images,lables);
            //保存訓練結果
            fisherFaceRecognizer.save("MyFisherFaceRecognizer.xml");
            //讀取自己的訓練結果
            fisherFaceRecognizer.read("MyFisherFaceRecognizer.xml");
            //設置閾值,閾值爲0則沒有匹配,閾值特別大時任意匹配,檢測返回爲-1時,則不能和訓練結果匹配
            fisherFaceRecognizer.setThreshold(3000.0);

            //開啓窗口開始人臉測試。
            OpenCVFrameGrabber grabber=new OpenCVFrameGrabber(0);
            grabber.setImageWidth(640);
            grabber.setImageHeight(480);
            grabber.start();
            //開啓攝像頭,獲取圖像(得到的圖像爲frame類型,需要轉換爲mat類型進行檢測)
            CanvasFrame canvas=new CanvasFrame("人臉檢測");
            canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            opencv_objdetect.CascadeClassifier classifier=new opencv_objdetect.CascadeClassifier("D:\\openCV\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface_improved.xml");
            while(true) {
                if (!canvas.isEnabled()) {
                    grabber.stop();
                    System.exit(0);
                }
                //抓取一針
                Frame frame=grabber.grab();
                //類型轉換
                OpenCVFrameConverter.ToMat converter=new OpenCVFrameConverter.ToMat();
                //用於保存灰圖
                Mat grey=new Mat();
                Mat original=converter.convertToMat(frame);
                //用於保存關注
                Mat roi=new Mat();
                //用於保存臉部
                Mat face=new Mat();
                opencv_imgproc.cvtColor(original,grey, COLOR_BGRA2GRAY);
                equalizeHist(grey,grey);
                //檢測人臉
                RectVector faces=new RectVector();
                classifier.detectMultiScale(grey,faces);
                IntPointer lable=new IntPointer(1);
                DoublePointer confidence=new DoublePointer(1);
                //識別部分
                for(int i=0;i<faces.size();i++){
                    Rect rect=faces.get(i);
                    rectangle(original,rect,new Scalar(0,255,0,1));
                    roi=new Mat(grey,rect);
                    resize(roi,face,new Size(92,112));
                    fisherFaceRecognizer.predict(face,lable,confidence);
                    int predictedLable=lable.get(0);
                    if(predictedLable==36){
                        String box_name="people:bank";
                        int pos_x=Math.max(rect.tl().x()-10,0);
                        int pos_y=Math.max(rect.tl().y()-10,0);
                        putText(original,box_name,new Point(pos_x,pos_y),FONT_HERSHEY_PLAIN,1.0,new Scalar(0,255,0,2.0));
                        testtimes++;
                    }else{
                        int pos_x=Math.max(rect.tl().x()-10,0);
                        int pos_y=Math.max(rect.tl().y()-10,0);
                        putText(original,"UnknownPeople!",new Point(pos_x,pos_y),FONT_HERSHEY_PLAIN,1.0,new Scalar(0,0,255,2.0));
                    }
                }
                //顯示
                frame=converter.convert(original);
                canvas.showImage(frame);
                showtimes++;
                if(testtimes>=60){
                    grabber.close();
                    canvas.dispose();
                    return true;
                }
                if(showtimes>=1800){
                    grabber.close();
                    canvas.dispose();
                    return false;
                }
                Thread.sleep(30);//30刷新一個圖像
            }
        } catch (Exception | FileNotFoundException | UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return false;
    }

}


pom文件如下:

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv-platform</artifactId>
            <version>3.4.1-1.4.1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章