Я уже обозначаемого по следующим ссылкам: Link 1 и Link 2Обучение SVM для изображений OpenCV
Из вышесказанного я должен удалось написать следующее:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
using namespace cv;
using namespace std;
int main(){
int num_files = 2;
int width = 128, height = 128;
Mat image[2];
image[0] = imread("Tomato.jpg");
image[1] = imread("Melon.jpg");
Mat new_image(2,height*width,CV_32FC1); //Training sample from input images
int ii = 0;
for (int i = 0; i < num_files; i++){
Mat temp = image[i];
ii = 0;
for (int j = 0; j < temp.rows; j++){
for (int k = 0; k < temp.cols; k++){
new_image.at<float>(i, ii++) = temp.at<uchar>(j, k);
}
}
}
//new_image.push_back(image[0].reshape(0, 1));
//new_image.push_back(image[1].reshape(0, 1));
Mat labels(num_files, 1, CV_32FC1);
labels.at<float>(0, 0) = 1.0;//tomato
labels.at<float>(1, 0) = -1.0;//melon
imshow("New image", new_image);
printf("%f %f", labels.at<float>(0, 0), labels.at<float>(1, 0));
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.gamma = 3;
params.degree = 3;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
CvSVM svm;
svm.train(new_image, labels, Mat(), Mat(), params);
svm.save("svm.xml"); // saving
svm.load("svm.xml"); // loading
Mat test_img = imread("Tomato.jpg");
test_img=test_img.reshape(0, 1);
imshow("shit_image", test_img);
test_img.convertTo(test_img, CV_32FC1);
svm.predict(test_img);
waitKey(0);
}
Я получаю следующее сообщение об ошибке :
unsupported format or combination of formats, input sample must have 32FC1 type in cvPreparePredictData ...
Я выполнил все шаги во второй ссылке. Все матрицы имеют тип 32FC1. Что мне не хватает? Что-то не так с параметрами svm? Ошибка возникает, когда я пытаюсь предсказать результат.
Side комментарий: вы объявляете два раза переменных I, J и K. Один раз достаточно (внутри 'for') – kebs
Кто-то просто отправил правильный ответ здесь, а затем удалил комментарий. – purudpd
Проблема была связана с различием в цветовом пространстве. Чтение файлов с оттенками серого (imread ("tomato.jpg", 0)) исправлено. – purudpd