我想用分類函數將我的輸入圖像與我已經創建的.xml文件分類。 這是訓練的人工神經網絡(ANN) 我不知道什麼是錯 我試圖代碼完全一樣的書「與OpenCV的實事工程」,在github上可預訂的 全碼: https://github.com/MasteringOpenCV/code/tree/master/Chapter5_NumberPlateRecognitionAssertion Failed(Layer_sizes!= 0)CvANN_MLP :: predict
技術上我用我自己的方式從完整圖片中提取數字段 並創建了ocr.xlm文件。
我真的不知道爲什麼,當我嘗試分類輸入的分段圖像(馬太福音輸入數組)我看到的錯誤:(!Layer_sizes = 0)斷言失敗CvANN_MLP ::預測
這裏是我的代碼
char const strCharacters[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
int const numCharacters = 9;
CvANN_MLP ann;
void train(Mat TrainData, Mat classes, int nlayers){
FileStorage fs;
fs.open("OCR.xml", FileStorage::READ);
Mat trainData;
fs["TrainingData"] >> trainData;
fs["classes"] >> classes;
Mat layers(1, 3, CV_32SC1);
layers.at<int>(0,0) = TrainData.cols;//input layer
layers.at<int>(1,0) = nlayers;//hidden layer
layers.at<int>(2,0) = numCharacters;//output layer
int buffer[] = { trainData.cols, 16, numCharacters };
ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1);
//Prepare trainClases
//Create a mat with n trained data by m classes
Mat trainClasses;
trainClasses.create(TrainData.rows, numCharacters, CV_32F);
for (int i = 0; i < trainClasses.rows; i++)
{
for (int k = 0; k < trainClasses.cols; k++)
{
//If class of data i is same than a k class
if (k == classes.at<int>(i))
trainClasses.at<float>(i, k) = 1;
else
trainClasses.at<float>(i, k) = 0;
}
}
Mat weights(1, TrainData.rows, CV_32FC1, Scalar::all(1));
//Learn classifier
ann.train(TrainData, trainClasses, weights);
}
int classify(Mat f){
float result = -1;
Mat output(1, numCharacters, CV_32FC1);
ann.predict(f, output);
Point maxLoc;
double maxVal;
minMaxLoc(output, 0, &maxVal, 0, &maxLoc);
//We need know where in output is the max val, the x (cols) is the class.
// result = output.at <float>(0, 0);
return maxLoc.x;
}
我打電話calssify像這樣在我的主要代碼:
int character = classify(roiResized);
我會很感激你的幫助。任何建議?
不幸的是,你的解決方案是過時的,你不應該推薦使用的OpenCV的不再有維持C-API給任何人在這裏。 – berak
你的意思是轉換CvMat *圖層= cvCreateMatHeader(1,3,CV_32SC1);到Mat *圖層=新的Mat(1,3,CV_32SC1);例如 ? – Kust