SVM в openCV выдает "cv :: Exception at memory memory" - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь создать простое приложение OCR с SVM, openCV, C ++ и Visual Studio 2008 (приложение mfc).

Мои обучающие примеры - это двоичные изображения машинно-печатных цифр (0-9),Я хочу использовать DAGSVM для этой многоклассовой задачи.Поэтому мне нужно создать 45 SVM, каждый из которых является SVM 2 класса (SVM (0,1), SVM (0,2) ... SVM (8,9)).

Вот какдела идут:

Параметры SVM:

CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

Данные обучающих образов класса i хранятся в матрице trainData [i] (каждая строка представляет собой пиксели изображения 28x28, что означаетматрица имеет 784 кол.)При обучении каждого SVM я создаю 2 матрицы с именем curTrainData & curTrainLabel.

for (int i = 0; i < 9; i++)
    for (int j = i+1; j < 10; j++)
    {
        curTrainData.create(trainData[i].rows + trainData[j].rows, 784, CV_32FC1);
        curTrainLabel.create(curTrainData.rows, 1, CV_32FC1);

        // merge 2 matrix: trainData[i] & trainData[j]
        for (int k = 0; k < trainData[i].rows; k++)
        {
            curTrainLabel.at<float>(k, 0) = 1.0; // class of digit i
            for (int l = 0; l < 784; l++)
                curTrainData.at<float>(k,l) = trainData[i].at<float>(k,l);
        }
        for (int k = 0; k < trainData[j].rows; k++)
        {
            curTrainLabel.at<float>(k + trainData[i].rows, 0) = -1.0; // class of digit j
            for (int l = 0; l < 784; l++)
            curTrainData.at<float>(k + trainData[i].rows,l) = trainData[j].at<float>(k,l);
        }

        svms[i][j].train(curTrainData, curTrainLabel, Mat(), Mat(), params);
    }

Я получил ошибку при вызове svms [i] [j] .train ... .Полная ошибка:

Unhandled exception at 0x75b5d36f in svm.exe: Microsoft C++ exception: cv::Exception at memory location 0x0022af8c..

По правде говоря, я не совсем понимаю SVM, реализованный в openCV, и не могу найти ни одного примера их работы с объектами на изображениях.

Я очень благодарен, если кто-то может сказать мне, что (что) не так: (

Обновление 09/03 : я ошибся. Ошибка происходит от:

str.Format(_T("Results\trained_%d_%d.xml"), i, j);  
svms[i][j].save(CT2A(str));

str - переменная CString.

Это остается, даже если я изменяю на:

svms[i][j].save("Results\trained.xml");

Я создал папку Результаты и другие файлы записываютсяхорошо в это (файлы для методов fopen (), imwrite () ...). Я не знаю, почему я не могу добавить папку, когда дело доходит до этого метода сохранения SVM.

1 Ответ

2 голосов
/ 08 марта 2012

Если вы используете обратную косую черту «\», вы должны вместо нее поставить «\\» (или вы можете использовать переднюю черту »/").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...