JavaCV:将整数数组转换为Mat

时间:2016-11-16 15:42:25

标签: java opencv javacv

我正在尝试使用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)
显然即使它确实有效,我仍然不会在那里有我的号码。非常感谢任何帮助。

1 个答案:

答案 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));

这应该有效:)