我正在尝试使用SVM,openCV,C ++和Visual Studio 2008(mfc app)创建一个简单的OCR应用程序。
我的训练样本是机器打印数字(0-9)的二进制图像。我想使用DAGSVM来解决这个多类问题。所以我需要创建45个SVM,每个SVM都是2类的SVM(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个cols)。 在训练每个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..
说实话我并不完全理解在openCV中实现的SVM,我找不到任何处理图像中对象的例子。
如果有人能告诉我错误是什么,我真的很感激:(
更新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");
我已经创建了文件夹Results和其他文件很好地写入其中(方法fopen(),imwrite()...的文件)。我不知道为什么我不能在svm的这种保存方法中添加文件夹。
答案 0 :(得分:2)
如果你使用反斜杠“\”,你必须改为使用“\\”(或者你可以使用frontslash“/”)。