java基于OpenCV的人脸识别

基于Java简单的人脸和人眼识别程序

使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html

注意:
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);

        }

    }

}

程序效果

如果在运行完成关闭图形窗口后再次运行出现下面这种错误是因为程序还没有结束

解决办法是点击下面这个除去启动

再点击终止就解决这个问题了

以后关闭图形界面后就点击终止按钮或者直接点击终止按钮就可以终止程序了

posted @ 2020-04-25 18:48  大海&  阅读(2777)  评论(0编辑  收藏  举报