openCV 中的 SVM 抛出"cv::Exception at memory location"

SVM in openCV throws "cv::Exception at memory location"

本文关键字:Exception memory location at cv 中的 SVM 抛出 openCV      更新时间:2023-10-16

我正在尝试使用SVM、openCV、C++和Visual Studio 2008(mfc应用程序)创建一个简单的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列)。在训练每个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("Resultstrained_%d_%d.xml"), i, j);  
svms[i][j].save(CT2A(str));

str是一个CString变量。

即使我改为:,它仍然存在

svms[i][j].save("Resultstrained.xml");

我已经创建了文件夹Results,其他文件都写得很好(方法fopen()、imwrite()…的文件)。我不知道为什么当涉及到svm的这种保存方法时,我不能添加文件夹。

如果使用反斜杠"\",则必须使用"\\"(或者可以使用前斜杠"/")。