用java写人脸识别系统
时间: 2023-05-23 12:07:24 浏览: 117
人脸识别系统的基本流程如下:
1. 采集人脸数据,构建人脸数据库;
2. 利用特征提取算法对人脸数据进行分析和处理,提取出每个人脸的特征向量;
3. 利用分类算法对每个人脸的特征向量进行分类,识别出人脸所属的人物;
4. 进行人脸比对,判断输入的人脸是否与人脸数据库中的人脸匹配;
Java可以采用以下方式实现人脸识别系统:
1. 采集人脸数据:使用JavaCV或Java SDK等工具包采集人脸图像数据;
2. 特征提取:使用OpenCV等工具包中的特征提取算法提取每个人脸的特征向量;
3. 分类算法:使用机器学习或深度学习等算法进行人脸识别的分类;
4. 人脸比对:利用已有的分类器对输入的人脸进行分类,然后对比输入的人脸与数据库中人脸的相似度,判断是否对应。
代码示例:
1. 采集人脸数据
```java
import org.bytedeco.javacpp.opencv_face.*;
import org.bytedeco.opencv.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_core.CV_32SC1;
import static org.bytedeco.opencv.global.opencv_core.CV_8UC1;
import static org.bytedeco.opencv.global.opencv_face.createEigenFaceRecognizer;
//采集人脸数据并存储至目录下
public class FaceTrain {
public static void main(String[] args) {
// 读取全部人脸图像数据
final File root = new File("images");
for (File person : root.listFiles()) {
// 针对每个人脸图像目录
for (File image : person.listFiles()) {
// 针对每张图片
final Mat img = imread(image.getAbsolutePath(), CV_8UC1);
if (img.empty()) {
System.err.println("文件" + image.getAbsolutePath() + "不存在或者图像无法读取!");
continue;
}
// 人脸检测
final MatVector faces = new MatVector(1);
final IntPointer ids = new IntPointer(1);
final RectVector rects = new RectVector(1);
final CascadeClassifier classifier = new CascadeClassifier("lbpcascade_frontalface.xml");
classifier.detectMultiScale(img, rects);
for (int i = 0; i < rects.size(); i++) {
final Rect face = rects.get(i);
Mat faceMat = new Mat(img, face);
resize(faceMat, faceMat, new Size(200, 200));
faces.put(faceMat);
ids.put(person.getName().hashCode());
}
// 人脸存储
final File faceFile = new File("faces");
if (!faceFile.exists()) {
faceFile.mkdirs();
}
createEigenFaceRecognizer();
FaceRecognizer faceRecognizer = createEigenFaceRecognizer();
faceRecognizer.train(faces, CV_32SC1, ids);
faceRecognizer.save("face.xml");
}
}
}
}
```
2. 特征提取
```java
import org.bytedeco.javacpp.opencv_face.*;
import org.bytedeco.opencv.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_core.CV_32SC1;
import static org.bytedeco.opencv.global.opencv_core.CV_8UC1;
import static org.bytedeco.opencv.global.opencv_face.createEigenFaceRecognizer;
//采集人脸数据并存储至目录下
public class FaceTrain {
public static void main(String[] args) {
final Mat img = imread(args[0], CV_8UC1);
// 人脸检测
final MatVector faces = new MatVector(1);
final IntPointer ids = new IntPointer(1);
final RectVector rects = new RectVector(1);
final CascadeClassifier classifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
classifier.detectMultiScale(img, rects);
if(rects.size() == 0) {
System.err.println("人脸检测失败!");;
}
for (int i = 0; i < rects.size(); i++) {
final Rect face = rects.get(i);
Mat faceMat = new Mat(img, face);
resize(faceMat, faceMat, new Size(200, 200));
faces.put(faceMat);
}
// 特征提取
createEigenFaceRecognizer();
FaceRecognizer faceRecognizer = createEigenFaceRecognizer();
faceRecognizer.load("face.xml");
int[] labels = new int[1];
double[] confidence = new double[1];
faceRecognizer.predict(faces.get(0), labels, confidence);
System.out.printf("人物编号:%d, 相似度:%f", labels[0], confidence[0]);
}
}
```
3. 分类算法
选取分类算法有很多种,可以通过数据来决定哪种算法比较适合,以下是样例代码
```java
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import weka.classifiers.bayes.NaiveBayes;
public class NaiveBayesClassifier {
public static void main(String[] args) throws Exception {
// 加载数据
DataSource source = new DataSource("iris.arff");
Instances data = source.getDataSet();
// 设置类别属性索引
if (data.classIndex() == -1)
data.setClassIndex(data.numAttributes() - 1);
// 划分训练集和测试集
Instances train = data.trainCV(5, 0);
Instances test = data.testCV(5, 0);
// 建立分类器并训练
NaiveBayes classifier = new NaiveBayes();
classifier.buildClassifier(train);
// 预测并评估
Evaluation eval = new Evaluation(train);
eval.evaluateModel(classifier, test);
System.out.println(eval.toSummaryString("\n=== Naive Bayes ===\n\n", false));
}
}
```
4. 人脸比对