2016-11-16 13 views
1

JavaCVを使用して写真データベースに顔認識を実装しようとしています。可能な顔を検出するのはうまくいきますが(すでにJavaには多くの例があります)、私は実際の認識をすることに悩まされています。より正確には、顔認識装置を訓練するときです。JavaCV:整数の配列をマットに変換する

テスト目的のために、トレーニング写真が配置されている「s」+ idとラベルされた既知の人物ごとにサブフォルダを持つフォルダ構造があります。何がうまくいくかは、画像を読み込んで配列に追加することです。何がうまくいかないのは、識別子を使って2番目の配列を作成することです。 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

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

これは動作するはずです:)

関連する問題