Я пытаюсь создать простое приложение 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.
просто догадаться, но это выглядит только как проблема с памятью, где объявляется 'svms' и каков ее размер? (должно быть не менее 9x10 после вашего оператора цикла) – Smash
@Smash: Да, я использую массив 10x10. Оказывается, проблема заключается в вызове svm.save() (как мое обновление выше). Если я смогу сохранить модель, мне придется использовать только один svm каждый раз. – Risa
, если вы используете обратную косую черту \, вам нужно поставить \\ вместо (или вы можете использовать frontslash /) – Smash