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