我正在尝试使用JavaCV在我的照片数据库中实现面部识别。虽然检测可能的面部工作正常(已经有很多Java的例子),但我坚持做实际识别。更准确地说,在训练面部识别器时。
出于测试目的,我有一个文件夹结构,每个已知人员标记为“s”+ id的子文件夹,其中包含训练照片。有效的是读取图像并将它们添加到数组中。什么是行不通的是创建带有标识符的第二个数组。 LBPHFaceRecognizer.train确实需要Mat,我无法弄清楚如何创建所需的数据结构。到目前为止我所拥有的是:
MatVector images = new MatVector();
List<Integer> ids = new ArrayList<Integer>();
File root = new File("orl_faces/");
for (File subFolder : root.listFiles()) {
if (subFolder.getName().matches("s\\d+") && subFolder.isDirectory()) {
int personId = Integer.parseInt(subFolder.getName().substring(1));
for (File file : subFolder.listFiles()) {
if (file.getName().endsWith(".pgm") && !"10.pgm".equals(file.getName())) {
IplImage img = cvLoadImage(file.getAbsolutePath());
images.put(img);
ids.add(personId);
}
}
}
}
// ---- FIXME here is where I am stuck ----
Mat labels = new Mat(new Size(ids.size(), 1));
for (int i = 0; i < ids.size(); i++) {
MatExpr m = Mat.ones(new Size(1, 1), CV_32SC1);
Mat m2 = m.asMat();
labels.push_back(m2);
}
model.train(images, labels);
执行此操作时,我得到了
Exception in thread "main" java.lang.RuntimeException: vector<T> too long
at org.bytedeco.javacpp.opencv_face$FaceRecognizer.train(Native Method)
显然即使它确实有效,我仍然不会在那里有我的号码。非常感谢任何帮助。
答案 0 :(得分:0)
您可以使用MatOfInt
和一系列整数。例如,如果您在List<Integer
收集标签:
int[] allLabels = new int[labels.size()];
for (int i = 0; i < labels.size(); i++) {
allLabels[i] = labels.get(i);
}
faceRecognizer.train(faces, new MatOfInt(allLabels));
这应该有效:)