1. 程式人生 > >java人臉識別(opencv3)

java人臉識別(opencv3)

package opencv;

import java.io.File;

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc; 
import org.opencv.objdetect.CascadeClassifier;

public class Hellopencv {
    public static void main(String[] args) {
/*
        String imageFileName="E:/111.jpg";
        File f = new File(imageFileName);
        
        //原圖片不存在直接退出
        if(!f.exists()){
            System.out.println("\n Image File Not Found!");
            
        }
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat image= Imgcodecs.imread(imageFileName);
      // System.out.println("mat = " + image.dump());
       image.release();*/
        detectFace("E:\\111.jpg");
    }

    public static boolean detectFace(String imageFileName) {
         File f = new File(imageFileName);
        
        //原圖片不存在直接退出
        if(!f.exists()){
            System.out.println("\n Image File Not Found!");
            return false;
        }
        //載入本地庫dll檔案
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        //載入分類器
        CascadeClassifier faceDetector = 
            new CascadeClassifier(); 
        faceDetector.load("E:\\resources\\lbpcascades\\lbpcascade_frontalface.xml");
        //讀取影象
        Mat image= Imgcodecs.imread(imageFileName);
        System.out.println("讀取成功");
        //檢測人臉
        Size min=new Size(100, 100);
        MatOfRect faceDetections=new MatOfRect();
        faceDetector.detectMultiScale(image,faceDetections,1.1,3,0,min);
        //檢測結果
        Rect[] rects=faceDetections.toArray();
        if(rects==null||rects.length==0){
            System.out.println(rects.length);
            return false;
        }
        int i=0;
        for(Rect rect:rects){
            Point x = new Point(rect.x, rect.y);
            Point y = new Point(rect.x + rect.width, rect.y + rect.height);
            //在image圖片上畫框,x,y可確定框的位置和大小,new Scalar(0, 255, 0)是框的顏色,自行調整
            Imgproc.rectangle(image, x,y, new Scalar(0, 255, 0));
            
            //儲存監測的人臉小圖片
            Rect r = new Rect(x, y);
            System.out.println(r.height+":"+r.width);
            Mat areaM = new Mat(image, r);
            //儲存監測的人臉小圖片到tmp+序號的jpg檔案
            String tmpFilePath = "e:\\opencv"+i+".jpg";

            Imgcodecs.imwrite(tmpFilePath, areaM);    
            i++;
        }
//        //在識別出來的人臉周圍話一個方框
//        Rect rect=rects[0];


        image.release();
        return     true;

}
}
 

這是opencv3對應的程式碼,如果是opencv2xx的話,可能在讀入和輸出圖片的時候方法有所不同