Tôi có một thư mục của mặt tích cực và tiêu cực khác của hình ảnh ở định dạng JPG, và tôi muốn đào tạo một SVM dựa trên đó hình ảnh, tôi đã thực hiện những điều sau đây nhưng tôi nhận được một lỗi:Làm thế nào để đào tạo một SVM với opencv dựa trên một tập hợp các hình ảnh?
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);
Khi tôi cố gắng chạy mà tôi có được:
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)
Tôi không thể quản lý SVM, ý tưởng nào? Cảm ơn
Tôi đang cố gắng để phân loại tấm dựa trên segmets tôi đã thu được, mã của tôi được dựa trên ví dụ này: https: // github .com/MasteringOpenCV/code/blob/master/Chapter5_NumberPlateRecognition/trainSVM.cpp –
Bạn đã thử sử dụng CV_64F chưa? Và đã làm bạn, chỉ để được hoàn toàn chắc chắn, kiểm tra những gì là loại 'trainingData' ngay trước khi nó được thông qua vào CvSVM? – morynicz
cảm ơn @morynicz, 'CvType.typeToString (trainingData.type())' sẽ trả về "CV_32FC3" .. Cũng cố chuyển đổi thành CV_64F với cùng lỗi –