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");
}