OpenCV 3.2.0:读取用于训练SVM的Canny图像

时间:2017-01-30 10:20:30

标签: c++ opencv opencv3.0

我在阅读训练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 ++异常:cv ::内存位置0x000000000015F300的异常。

指的是:

CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);

我已经尝试过&#34; uchar&#34;同样也得到了同样的例外。有人可以指导我如何解决这个问题,如果在修复当前代码后其余代码中会出现更多问题?

1 个答案:

答案 0 :(得分:1)

问题是imgMat的类型是CV_8UC3(无论它是否真的有颜色)。

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

在循环之前,将图像转换为灰度,不应该崩溃。

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