[英]SVM in openCV throws “cv::Exception at memory location”
我正在尝试使用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]中(每行是28×28图像的像素,这意味着矩阵具有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);
}
. 我在调用遇到错误。 完整的错误是:
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的这种保存方法中添加文件夹。
如果你使用反斜杠“\\”,你必须改为使用“\\\\”(或者你可以使用前缀“/”)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.