OPENCV人臉檢測正臉側臉

haarcascades
haarcascades_cuda
hogcascades
lbpcascades

分別表示通過“haar”、 “harr”、“hog”和“lbp”三種不同的特徵而訓練出的分類器
haar"特徵主要用於人臉

vec_files它可用來訓練人臉分類器,窗口大小爲: -w 24 -h 24

1.圖片反轉

        Mat img = Imgcodecs.imread("img/1.jpg");
        
        Mat dst1 = new Mat(img.rows(), img.cols(), CvType.CV_8UC3);
        Mat dst2 = new Mat(img.rows(), img.cols(), CvType.CV_8UC3);
        Mat dst3 = new Mat(img.rows(), img.cols(), CvType.CV_8UC3);

        //向右翻轉
        Core.flip(img, dst1, 1);
        //向下翻轉
        Core.flip(img, dst2, 0);
        //同時向右向下翻轉
        Core.flip(img, dst3, -1);

2.檢測

CascadeClassifier facebook = new CascadeClassifier(
					"E:\\opencv4.4.0\\opencv\\sources\\data\\haarcascades_cuda\\haarcascade_frontalface_alt2.xml");
CascadeClassifier profilefaceFacebook = new CascadeClassifier(
						"E:\\opencv4.4.0\\opencv\\sources\\data\\haarcascades_cuda\\haarcascade_profileface.xml");

/**
	 * 
	 * @param cc 識別類
	 * @param image 圖片
	 * @param sc 顏色
	 * @param flip 是否反轉
	 * @return
	 */
	public static Map<String,Object> getFace(CascadeClassifier cc,Mat image,Scalar sc,boolean flip) {
      Map<String,Object> resultMap=new HashMap<String,Object>();
        
		MatOfRect face = new MatOfRect();
		if(flip) {
			Core.flip(image, image, 1);
		}
		cc.detectMultiScale(image, face);
		
		Rect[] rects = face.toArray();
		System.out.println("匹配到 " + rects.length + " 個人臉");
		// 4 爲每張識別到的人臉畫一個圈
		for (int i = 0; i < rects.length; i++) {
			Imgproc.rectangle(image, new Point(rects[i].x, rects[i].y),
					new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height), sc);
			/*
			 * Imgproc.putText(image, "PEOPLE", new Point(rects[i].x, rects[i].y),
			 * Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX, 1.0, new Scalar(25,255,255), 1,
			 * Imgproc.LINE_AA, false);
			 */
		}
		
		if(flip) {
			Core.flip(image, image, 1);
		}
		
		boolean check=rects.length<1?false:true;
		resultMap.put("check", check);
		resultMap.put("Mat", image);
		return resultMap;
	}

3.識別

public static Mat getFace(Mat image) {
		
		//正臉藍色
		Map<String,Object> resultMap=ImageUtil.getFace(facebook, image,new Scalar(0,255,255),false);
		if(!(boolean)resultMap.get("check")) {
			//右側臉青色
			resultMap=ImageUtil.getFace(profilefaceFacebook, image,new Scalar(255, 255, 0),false);
			if(!(boolean)resultMap.get("check")) {
				//左側臉藍色
				resultMap=ImageUtil.getFace(profilefaceFacebook, image,new Scalar(255, 0, 0),true);
			}
		}
		return (Mat) resultMap.get("Mat");
	}

歡迎star

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章