2015-12-23 2 views
0

Я уже обозначаемого по следующим ссылкам: 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? Ошибка возникает, когда я пытаюсь предсказать результат.

+1

Side комментарий: вы объявляете два раза переменных I, J и K. Один раз достаточно (внутри 'for') – kebs

+0

Кто-то просто отправил правильный ответ здесь, а затем удалил комментарий. – purudpd

+0

Проблема была связана с различием в цветовом пространстве. Чтение файлов с оттенками серого (imread ("tomato.jpg", 0)) исправлено. – purudpd

ответ

1

check

1) Tomato.jpg и Melon.jpg размер 128 * 128?
2) оба изображения оттенки серого?

если нет. попробуйте этот код:
Я просто добавить изменение размера(), cvtColor() и печать результат

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/ml/ml.hpp> 
#include <opencv2\imgproc\imgproc.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", 0); 
    image[1] = imread("Melon.jpg", 0); 

    resize(image[0], image[0], Size(width, height)); 
    resize(image[1], image[1], Size(width, height)); 

    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", 0); 
    resize(test_img, test_img, Size(width, height)); 
    test_img = test_img.reshape(0, 1); 
    imshow("shit_image", test_img); 
    test_img.convertTo(test_img, CV_32FC1); 
    float res = svm.predict(test_img); 
    if (res > 0) 
     cout << endl << "Tomato"; 
    else 
     cout << endl << "Melon"; 
    waitKey(0); 
} 
+0

Я смог исправить проблему. Проблема заключалась в том, что учебные изображения и тестовое изображение не были в пространстве пространства. Я сделал все оттенки серого, тем самым фиксируя код. – purudpd

+0

@PurusharthDwivedi, пожалуйста, закройте свой вопрос, или если ответ выше помог - отметьте его – Liberus

Смежные вопросы