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

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