У меня проблема с чтением изображения края для обучения 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]);
Я пробовал это с «учаром», но получил то же исключение. Может ли кто-нибудь посоветовать мне, как решить эту проблему, и будут ли проблемы в остальной части кода после исправления текущей?
Mat trainingMat(numFiles, imgArea, CV_8UC3);
Разве это неCV_32FC1
, поскольку вы получаете доступ к его значениям с помощью.at<float>
? - person Miki   schedule 30.01.2017imgMat
какCV_8UC3
. ИспользуйтеMat imgMat = imread("C://canny.jpg", IMREAD_GRAYSCALE);
, чтобы вести его какCV_8UC1
. Рекомендую немного изучитьcv::Mat
- person Miki   schedule 30.01.2017