Ich habe einen Ordner von Positiven und eine andere von Negativen Bilder im JPG-Format, und ich möchte ein SVM basierend trainieren auf, dass die Bilder, ich habe nach dem getan, aber ich erhalte eine Fehlermeldung:Wie trainiere ich eine SVM mit opencv basierend auf einer Reihe von Bildern?
Mat classes = new Mat();
Mat trainingData = new Mat();
Mat trainingImages = new Mat();
Mat trainingLabels = new Mat();
CvSVM clasificador;
for (File file : new File(path + "positives/").listFiles()) {
Mat img = Highgui.imread(file.getAbsolutePath());
img.reshape(1, 1);
trainingImages.push_back(img);
trainingLabels.push_back(Mat.ones(new Size(1, 1), CvType.CV_32FC1));
}
for (File file : new File(path + "negatives/").listFiles()) {
Mat img = Highgui.imread(file.getAbsolutePath());
img.reshape(1, 1);
trainingImages.push_back(img);
trainingLabels.push_back(Mat.zeros(new Size(1, 1), CvType.CV_32FC1));
}
trainingImages.copyTo(trainingData);
trainingData.convertTo(trainingData, CvType.CV_32FC1);
trainingLabels.copyTo(classes);
CvSVMParams params = new CvSVMParams();
params.set_kernel_type(CvSVM.LINEAR);
clasificador = new CvSVM(trainingData, classes, new Mat(), new Mat(), params);
Als ich versuche zu laufen das erhalte ich:
OpenCV Error: Bad argument (train data must be floating-point matrix) in cvCheckTrainData, file ..\..\..\src\opencv\modules\ml\src\inner_functions.cpp, line 857
Exception in thread "main" CvException [org.opencv.core.CvException: ..\..\..\src\opencv\modules\ml\src\inner_functions.cpp:857: error: (-5) train data must be floating-point matrix in function cvCheckTrainData
]
at org.opencv.ml.CvSVM.CvSVM_1(Native Method)
at org.opencv.ml.CvSVM.<init>(CvSVM.java:80)
Ich kann es nicht schaffen, die SVM zu trainieren, keine Ahnung? Danke
Ich versuche, Platten zu klassifizieren basierend auf segmets ich bereits erhalten, ist mein Code auf der Basis dieses Beispiel: https: // Github .com/MasteringOpenCV/code/blob/master/Kapitel5_NumberPlateRecognition/trainSVM.cpp –
Haben Sie versucht, CV_64F zu verwenden? Und haben Sie, um absolut sicher zu sein, kurz vor der Weitergabe an CvSVM überprüft, welche Art von 'Trainingsdaten' vorliegt? – morynicz
danke @morynicz, 'CvType.typeToString (trainingData.type())' würde "CV_32FC3" zurückgeben .. Auch versucht, CV_64F mit dem gleichen Fehler –