java基於OpenCV的人臉識別

基於Java簡單的人臉和人眼識別程序

使用這個程序以前必須先安裝配置OpenCV詳細教程見:http://www.javashuo.com/article/p-onkbpfnt-gu.htmlhtml

注意:
D:/1-NCVT/1.2/1.JavaProgramming/OpenCV/opencv/*前面這部分地址是看你存放的位置決定的*/sources/data/haarcascades/haarcascade_frontalface_alt.xml/*後面的地址不變固定在這個地方*/
package faceDistinguish2;

import java.util.List;

import org.opencv.core.Core;

import org.opencv.core.CvType;

import org.opencv.core.Mat;

import org.opencv.core.MatOfRect;

import org.opencv.core.Point;

import org.opencv.core.Rect;

import org.opencv.core.Scalar;

import org.opencv.highgui.HighGui;

import org.opencv.imgproc.Imgproc;

import org.opencv.objdetect.CascadeClassifier;

import org.opencv.videoio.VideoCapture;

 /**
  * 基於openc的人臉識別
  * @author Ocean
  * 
  */
public class FaceID {

    /**
     * OpenCV人臉識別
     * @param rgb
     * @param gray
     */
    public static void faceRecognition(Mat rgb, Mat gray) {
    	
    	// 讀取OpenCV的人臉特徵識別文件
        CascadeClassifier cascade = new CascadeClassifier("D:/1-NCVT/1.2/1.JavaProgramming/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
        //在路徑上沒有找到相關文件返回1
        if (cascade.empty()) {
            System.out.println("人臉識別文件讀取失敗");
            //return;
        }
        
        MatOfRect rect = new MatOfRect();
        //檢測人臉
        cascade.detectMultiScale(gray, rect);
     // 爲每張識別到的人臉畫一個圈
        for (Rect re : rect.toArray()) {

            Imgproc.rectangle(rgb, new Point(re.x, re.y), new Point(re.x+ re.width, re.y + re.height), new Scalar(0, 0, 255));

        }
        //圖形界面顯示
        HighGui.imshow("人臉識別", rgb);

    }
    /**
     * OpenCV人眼識別
     * @param rgb
     * @param gray
     */
	public static void eyeRecognition(Mat rgb, Mat gray) {
	    	
	    	// 讀取OpenCV的人眼特徵識別文件
	    	CascadeClassifier cascade = new CascadeClassifier("D:/1-NCVT/1.2/1.JavaProgramming/OpenCV/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml");
	        if (cascade.empty()) {
	            System.out.println("人眼識別文件讀取失敗");
	            return;
	        }
	
	        MatOfRect rect = new MatOfRect();
	
	        cascade.detectMultiScale(gray, rect);
	        
	        for (Rect re : rect.toArray()) {
	            Imgproc.rectangle(rgb, new Point(re.x, re.y), new Point(re.x+ re.width, re.y + re.height), new Scalar(255, 0, 0));
	
	        }
	
	       // HighGui.imshow("人臉識別", rgb);
	
	    }

 

    public static void main(String[] args) {
    	 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    	// 實例化相機
        VideoCapture videoCapture = new VideoCapture();
      // 若是要從攝像頭獲取視頻 則要在 VideoCapture 的構造方法寫 0
        if (!videoCapture.open(0)) {

            System.out.println("相機打開失敗");
            return;	

        }
        while (true) {
            Mat img = new Mat();

            if (!videoCapture.read(img)) {

                return;

            }
            Mat rgb = new Mat();
            // 灰度化
            Imgproc.cvtColor(img, rgb, Imgproc.COLOR_BGR2RGB);

            Mat gray = new Mat();
            
            Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY);
            faceRecognition(img, gray);
            eyeRecognition(img, gray);
            HighGui.waitKey(10);

        }

    }

}

程序效果

若是在運行完成關閉圖形窗口後再次運行出現下面這種錯誤是由於程序尚未結束

解決辦法是點擊下面這個除去啓動

再點擊終止就解決這個問題了

之後關閉圖形界面後就點擊終止按鈕或者直接點擊終止按鈕就能夠終止程序了
java

相關文章
相關標籤/搜索