【问题标题】:JavaCV: convert array of integer to MatJavaCV:将整数数组转换为 Mat
【发布时间】:2017-03-30 21:25:50
【问题描述】:

我正在尝试使用 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)

很明显,即使它确实有效,我仍然不会在其中输入我的号码。非常感谢任何帮助。

【问题讨论】:

    标签: java opencv javacv


    【解决方案1】:

    您可以使用MatOfInt 和一个整数数组。比如你在List&lt;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));
    

    这应该工作:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2014-10-21
      • 2017-05-14
      • 2016-10-22
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多