繁体   English   中英

JavaCV:将整数数组转换为Mat

[英]JavaCV: convert array of integer to Mat

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

显然,即使它确实有效,我仍然不会有我的号码。 任何帮助是极大的赞赏。

您可以使用MatOfInt和一组int。 例如,如果您在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));

这应该工作:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM