一、JavaOpenCV环境搭建
1.OpenCV下载
OpenCV官网:https://opencv.org/
2.导入OpenCv库
1)导入包
2)导入动态库
VM option输入OpenCv动态库路径:
-Djava.library.path=D:\GoogleDownload\opencv\build\java\x64;D:\GoogleDownload\opencv\build\x64\vc15\bin
二、人脸笑容识别
1.SVM模型训练
1)图片读取
读取函数
public static void getFace(String filePath) {
System.out.println("读取人脸......");
//人脸检测模型
CascadeClassifier faceDetector = new CascadeClassifier("D:\\GoogleDownload\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml");
//定义人脸检测
MatOfRect faceDetections = new MatOfRect();
//获取图像所在的文件夹
File file = new File(filePath);
//遍历文件夹中的所有图片
for (File f : file.listFiles()) {
//读取图片
Mat image = Imgcodecs.imread(f.getAbsolutePath());
//对图像进行人脸检测
faceDetector.detectMultiScale(image, faceDetections);
//获取人脸区域
Rect[] rects = faceDetections.toArray();
//存在人脸
if (faceDetections.toArray().length > 0) {
//获得人脸区域
for (Rect rect : rects) {
Mat mat = new Mat(rect.width, rect.width, CvType.CV_8UC3);
for (int i = rect.x; i < rect.x + rect.width; i++) {
for (int j = rect.y; j < rect.y + rect.height; j++) {
mat.put(j - rect.y, i - rect.x, image.get(j, i));
}
}
//截取人脸区域
Imgproc.resize(mat, mat, new Size(64, 64), 0, 0, 0);
//保存图像
Imgcodecs.imwrite("D:\\SmileRecongnize\\genki4k\\files" + f.getName(), mat);
}
}
}
System.out.println("读取人脸完毕");
}
2)图片分组
public static void getRandomFile(String filePath) {
System.out.println("图片随机分组......");
File file = new File(filePath);
File listFile[] = file.listFiles();
Random random = new Random();
//初始化标签
//前2162为笑脸
for (int i = 0; i < 3670; i++) {
String no = listFile[i].getName().substring(4, 8);
if (Integer.parseInt(no) <= 2162)
flags[Integer.parseInt(no)] = 1;
else
flags[(Integer.parseInt(no))] = 0;
}
//随机排列,连同标签一起排列
for (int i = 0; i < 3670; i++) {
int r = random.nextInt(i + 1);
File tmp = listFile[i];
listFile[i] = listFile[r];
listFile[r] = tmp;
int t = flags[i];
flags[i] = flags[r];
flags[r] = t;
}
//分组
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 367; j++) {
randomFiles[i][j] = listFile[i * 367 + j];
}
}
System.out.println("图片随机分组完毕");
}
3)图片处理
public static void handleFace() {
//最好得分
double best