2012-03-08 2 views
0

Я пытаюсь создать простое приложение OCR с SVM, openCV, C++ и Visual Studio 2008 (приложение mfc).SVM в openCV бросает «cv :: Exception at memory location»

Мои учебные образцы представляют собой двоичные изображения машинописных цифр (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); 

данных учебных изображений класса я хранятся в матрице trainData [я] (каждая строка является пиксели 28х28 изображения, что означает, что матрица имеет 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 [я] [J] .train .... Полная ошибка:

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

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

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

Update 09/03:. я был ошибочно ошибка приходит от:

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

ул переменная CString

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

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

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

+0

просто догадаться, но это выглядит только как проблема с памятью, где объявляется 'svms' и каков ее размер? (должно быть не менее 9x10 после вашего оператора цикла) – Smash

+0

@Smash: Да, я использую массив 10x10. Оказывается, проблема заключается в вызове svm.save() (как мое обновление выше). Если я смогу сохранить модель, мне придется использовать только один svm каждый раз. – Risa

+0

, если вы используете обратную косую черту \, вам нужно поставить \\ вместо (или вы можете использовать frontslash /) – Smash

ответ

2

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

+0

Большое спасибо. Мне глупо игнорировать предупреждения IDE. – Risa