我在读取边缘图像以训练SVM时遇到问题:

int numFiles = 1;
int imgArea = 60 * 60; //canny image size
Mat trainingMat(numFiles, imgArea, CV_32FC1);// or  CV_8UC3

Mat imgMat = imread("C://canny.jpg");
int ii = 0; // Current column in trainingMat
for (int i = 0; i<imgMat.rows; i++) {
    for (int j = 0; j < imgMat.cols; j++) {
        trainingMat.at<float>(numFiles, ii++) = imgMat.at<uchar>(i, j); --> here the error
    }
}
Mat labels(numFiles, 1, CV_32FC1);

Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::LINEAR);
svm->setGamma(3);

svm->train(trainingMat, ml::ROW_SAMPLE, labels);
svm->save("svm_filename");
svm->load("svm_filename");

//test image using the trained svm
Mat imgMatTest = imread("C://canny1.jpg");
svm->predict(imgMatTest);

我遇到的异常是:
trainingMat.at<float>(numFiles, ii++) = imgMat.at<uchar>(i, j);

test.exe中0x000007FEFCE4A06D的未处理异常:Microsoft C++异常:内存位置0x000000000015F300的cv::Exception。

指的是:
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);

我也尝试过使用“uchar”,但是得到了相同的异常。有人可以指导我如何解决此问题,以及在解决当前问题之后的其余代码中是否还有其他问题?

最佳答案

问题在于imgMat的类型为CV_8UC3(实际上是否具有颜色)。

当您使用imgMat.at访问imgMat时,访问方法需要CV_8UC1,但实际情况并非如此。

在循环之前,请将图像转换为灰度图像,并且不会崩溃。

cv::Mat gray;
cv::cvtColor(imgMat, gray, CV_BGR2GRAY);

09-06 11:19