Wie trainieren einer SVM mit opencv beruht auf einer Reihe von Bildern?
Ich habe einen Ordner der positive und eine negative Bilder im JPG-format, und ich will trainieren einer SVM, basierend auf den Bildern, ich habe Folgendes getan, aber ich erhalte eine Fehlermeldung:
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);
Wenn ich versuche zu laufen, dass ich erhalten:
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 nicht verwalten, zum trainieren der SVM, keine Ahnung? Dank
Ich bin versucht zu klassifizieren Platten basierend auf segmets ich bereits erhalten, mein code basiert auf diesem Beispiel: github.com/MasteringOpenCV/code/blob/master/...
Haben Sie versucht, mit CV_64F? Und hast Du, nur um absolut sicher zu sein, überprüfen Sie, was ist die Art der
danke @morynicz, 'CvType.typeToString(trainingData.type())' zurückkehren würde "CV_32FC3".. Auch versucht, die Umwandlung zu CV_64F mit dem gleichen Fehler
Haben Sie versucht, mit CV_64F? Und hast Du, nur um absolut sicher zu sein, überprüfen Sie, was ist die Art der
trainingData
kurz bevor es übergeben wird in CvSVM?danke @morynicz, 'CvType.typeToString(trainingData.type())' zurückkehren würde "CV_32FC3".. Auch versucht, die Umwandlung zu CV_64F mit dem gleichen Fehler
InformationsquelleAutor Joaquín L. Robles | 2013-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, dass Sie wissen, was Sie tun, durch Umformen aus einem Bild und verwenden Sie es, um Zug SVM, die wahrscheinlichste Ursache HIERFÜR ist, dass Ihre
ausfällt, um wirklich zu Lesen, ein Bild, generiert eine matrix
img
mit nulldata
Eigenschaft, die schließlich Auslöser der folgenden, in der OpenCV-code:Grundsätzlich
train_data
scheitert die erste Bedingung ist (d.h. eine gültige matrix) anstatt versagt die zweite Bedingung (Typ CV_32FC1).Darüber hinaus, obwohl Umformen arbeitet auf der
*this
Objekt, es wirkt wie ein filter und seine Wirkung ist nicht von Dauer. Wenn es ist verwendet in einem einzigen Satz, ohne sofort verwendet werden, oder zugeordnet zu einer anderen Variablen es wird nutzlos sein. Ändern Sie die folgenden Zeilen im code::
InformationsquelleAutor Bee
Genauso wie der Fehler sagt, Sie ändern müssen, geben Sie Ihre matrix aus integer-Typ, wahrscheinlich CV_8U, floating point, CV_32F oder CV_64F. Es zu tun, die Sie verwenden können,
cv::Mat::convertTo()
. Hier ist ein bisschen über-tiefen und Arten von Matrizen.Oops. Sorry, hatte nicht gesehen, dass.
InformationsquelleAutor morynicz