OpenCV 3.2.0: чтение образа Canny для обучения SVM

У меня проблема с чтением изображения края для обучения 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);

Необработанное исключение в 0x000007FEFCE4A06D в test.exe: исключение Microsoft C ++: cv :: Exception в ячейке памяти 0x000000000015F300.

который относится к:

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

Я пробовал это с «учаром», но получил то же исключение. Может ли кто-нибудь посоветовать мне, как решить эту проблему, и будут ли проблемы в остальной части кода после исправления текущей?


person userfreindly    schedule 30.01.2017    source источник
comment
Mat trainingMat(numFiles, imgArea, CV_8UC3); Разве это не CV_32FC1, поскольку вы получаете доступ к его значениям с помощью .at<float>?   -  person Miki    schedule 30.01.2017
comment
@Miki такое же исключение возникает и при использовании CV_32FC1!   -  person userfreindly    schedule 30.01.2017
comment
Вы загружаете imgMat как CV_8UC3. Используйте Mat imgMat = imread("C://canny.jpg", IMREAD_GRAYSCALE);, чтобы вести его как CV_8UC1. Рекомендую немного изучить cv::Mat   -  person Miki    schedule 30.01.2017


Ответы (1)


Проблема в том, что imgMat имеет тип CV_8UC3 (независимо от того, имеет ли он цвет или нет).

Когда вы получаете доступ к imgMat с imgMat.at, метод доступа ожидает CV_8UC1, что не так.

Перед циклом конвертируйте изображение в оттенки серого, и оно не должно вылетать.

cv::Mat gray;
cv::cvtColor(imgMat, gray, CV_BGR2GRAY);
person Pedro Batista    schedule 30.01.2017