我在读取边缘图像以训练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);