2017-12-11 18 views
1

인터넷 (yale)의 샘플로 분류기를 훈련 시키려고했지만, 테스트 그림으로 트레이닝 그림 중 하나를 입력 할 때 잘못된 예측 (실제로는 카테고리 "1"만 출력)이 계속 발생합니다. 아무도 내게 어떤 힌트를 줄 수 있을까요? 나는 아래에 나의 코드를 첨부했다.OpenCV JAVA 얼굴 인식기 정확도?

(I 오류 bad arguement, size(1,30000), (10000,66).... 것은 내가 그렇게하지 않으면 나타 때문에 그들을 다시 grayscaled. 그들은 이미 grayscaled대로 문제가 훈련 샘플 것 같아요.)

import org.opencv.face.FaceRecognizer; 
import org.opencv.core.Mat; 
import org.opencv.core.MatOfInt; 
import org.opencv.core.*; 
import org.opencv.face.Face; 
import org.opencv.imgcodecs.Imgcodecs; 
import java.io.File; 
import java.io.FilenameFilter; 
import java.util.List; 
import java.util.ArrayList; 
import org.opencv.imgproc.Imgproc; 

public class FaceRecognization { 
    public static void main(String[] args) { 
     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
     String trainingDir = "C:\\Users\\songli\\Desktop\\yale\\train"; 
     String testImgPath = "C:\\Users\\songli\\Desktop\\yale\\5-6.bmp"; 
     Mat testImg = Imgcodecs.imread(testImgPath); 
     Mat gray = new Mat(); 
     File root = new File(trainingDir); 
     FilenameFilter bmpFilter = new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       return name.toLowerCase().endsWith(".bmp"); 
      } 
     }; 

     File[] imageFiles = root.listFiles(bmpFilter); 
     List<Mat> list = new ArrayList<Mat>(imageFiles.length); 
     int[] labels = new int[imageFiles.length]; 

     int counter = 0; 
     int label; 
     Mat grayImg = new Mat(); 
     Mat grayTestImg = new Mat(); 
     Mat img = new Mat(); 
     for (File image : imageFiles) { 
      img = Imgcodecs.imread(image.getAbsolutePath()); 
      // System.out.print(img.elemSize()); 
      label = Integer.parseInt(image.getName().split("\\-")[0]); 
      grayImg.create(img.width(), img.height(), 1); 
      Imgproc.cvtColor(img, grayImg, Imgproc.COLOR_BGR2GRAY); 
      list.add(grayImg); 
      labels[counter] = label; 
      counter++; 
     } 
     // System.out.print(labels[11]); 
     MatOfInt labels1 = new MatOfInt(); 
     labels1.fromArray(labels); 
     FaceRecognizer fr = Face.createEigenFaceRecognizer(); 
     fr.train(list, labels1); 
     grayTestImg.create(testImg.width(), testImg.height(), 1); 
     Imgproc.cvtColor(testImg, grayTestImg, Imgproc.COLOR_BGR2GRAY); 

     int predictedlabel = fr.predict_label(grayTestImg); 
     // Imgcodecs.imwrite("C:\\Users\\songli\\Desktop\\testImg.jpg", 
     // testImg); 

     // int[] predLabel = new int[1]; 
     // double[] confidence = new double[1]; 
     // int result = -1; 
     // fr.predict(testImgGrey,predLabel,confidence); 
     // result = predLabel[0]; 
     System.out.println("Predicted label: " + predictedlabel); 
    } 
} 

답변

0

좋아들 I 내가 잘못 간 장소를 알아라.

Imgproc.cvtColor (img, grayImg, Imgproc.COLOR_BGR2GRAY); ->

Imgproc.cvtColor (img, img, Imgproc.COLOR_BGR2GRAY);

완료!

어리석은 실수. 미안 해요.