2017-11-13 4 views
0

Das ist die Frage, ich weiß nicht, wie ich damit umgehen soll. Die Problemlinie ist in svm.trainAuto(param1,....). Ich lese 400 imgs und gespeichert in trainningSet (200 hat Autoplate und 200 nicht), und ihre Etiketten in Klassen gespeichert, ich möchte ein SVM-Modell trainieren, aber trainAuto Methode eine Ausnahme zu fangen. Die trainningData und clusses nicht null ist, habe ich bereits geprüft,opencv java SVM api nullPointException

package com.xjtu.svm; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

import org.opencv.core.Core; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.imgcodecs.Imgcodecs; 
import org.opencv.ml.Ml; 
import org.opencv.ml.SVM; 

public class ReadInPlate { 
private final static int amount=200; 
private static int width; 
private static int height; 
/** 
* @param hasPlate 
* @param label 
*/ 
public static void readInPlateImg(Mat mat, List<Byte>label) { 
    String path="E:/HasPlate"; 
    File file=new File(path); 

    File[] fileArray=file.listFiles(); 
    if(fileArray.length==0) { 
     System.out.println("empty file"); 
    } 

    for(int i=0; i<amount; i++) { 

     path=fileArray[i].getAbsolutePath(); 
     Mat tmp=Imgcodecs.imread(path); 
     width=tmp.cols(); 
     height=tmp.rows(); 
     Mat feature=Feature.extractFeature(tmp); 
     mat.push_back(feature); 
     label.add((byte)1); 
    } 
} 

/** 
* @param noPlate 
* @param label 
*/ 
public static void readInNoPlateImg(Mat mat, List<Byte>label) { 
    String path="E:/NoPlate"; 
    File file=new File(path); 
    File[] fileArray=file.listFiles(); 
    if(fileArray.length==0) { 
     System.out.println("empty file"); 
    } 
    for(int i=0; i<amount; i++) { 
     path=fileArray[i].getAbsolutePath(); 
     Mat tmp=Imgcodecs.imread(path); 
     Mat feature=Feature.extractFeature(tmp); 
     mat.push_back(feature); 
     label.add((byte)0); 
    } 
} 

public static void main(String []args) { 
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
    List<Byte> label=new ArrayList<Byte>(); 

    Mat trainningSet=new Mat(); 
    Mat trainningData=new Mat(); 
    Mat classes=new Mat(2*amount, 1, CvType.CV_8UC1); 
    Mat clusses=new Mat(); 
    readInPlateImg(trainningSet, label); 
    readInNoPlateImg(trainningSet, label); 
    trainningSet.convertTo(trainningData, CvType.CV_32F);  

    for(int i=0; i<label.size(); i++) { 
     byte[] t=new byte[1]; 
     t[0]=label.get(i); 
     classes.put(i, 0, t); 
    } 
    classes.convertTo(clusses, CvType.CV_32F); 
    SVM svm =SVM.create(); 
    svm.setType(SVM.C_SVC); 
    svm.setKernel(SVM.LINEAR); 
    svm.setDegree(0.1); 
    svm.setGamma(1); 
    svm.setCoef0(0); 
    svm.setC(1); 
    System.out.println("trainningDataType: "+CvType.typeToString(trainningData.type())); 
    System.out.println("classesType: "+CvType.typeToString(clusses.type())); 
    System.out.println(trainningData.rows()==clusses.rows()); 

    *svm.trainAuto(trainningData, //exception catched in this line 
      Ml.ROW_SAMPLE, 
      clusses, 
      10, 
      SVM.getDefaultGridPtr(SVM.C), 
      SVM.getDefaultGridPtr(SVM.GAMMA), 
      SVM.getDefaultGridPtr(SVM.P), 
      SVM.getDefaultGridPtr(SVM.NU), 
      SVM.getDefaultGridPtr(SVM.COEF), 
      SVM.getDefaultGridPtr(SVM.DEGREE), 
      true);* 

    System.out.println("classes.size(): "+classes.rows()+", "+classes.cols()); 
    System.out.println(label.size()+", "+trainningSet.rows()+", "+trainningSet.cols()); 
} 

}

Exception in thread "main" java.lang.Exception: unknown exception 
at org.opencv.ml.SVM.trainAuto_0(Native Method) 
at org.opencv.ml.SVM.trainAuto(SVM.java:145) 
at com.xjtu.svm.ReadInPlate.main(ReadInPlate.java:106) 
+0

Bitte vervollständigen Sie den Stacktrace –

+0

Dieser Stacktrace ist nicht sinnvoll. Gibt es mehr Informationen in der Stack-Trace? Was ist das Problem genau? Ich sehe, dass Sie eine Methode aufrufen, aber wir kennen weder die Methodensignatur noch andere (technische) Informationen unter der Haube. Was haben Sie versucht, dieses Problem zu lösen? Diese Frage lautet im Wesentlichen: "Ich habe ein Problem, beheben Sie bitte." – Dudemanword

+0

@mustabelMo @ Dudemanword, fügte ich alle Codes, bitte helfen Sie mir das Problem zu finden, vielen Dank –

Antwort

0

Das Hauptproblem ist das Datenformat, opencv SVM angefordert CvType.CV_32FC1 (float) für trainning Daten und CvType. CV_32SC1 (int) für die Datenbeschriftung, so dass das Datenformat die Anforderung von opencv erfüllen sollte, und ändern Sie trainningSet.converTo (trainningData, CvType.CV_32FC1), classes.convertTo (cluses, CvType.CV_32SC1);, dann sollte es funktionieren.

Verwandte Themen