2015-05-15 65 views
0

我想用分類函數將我的輸入圖像與我已經創建的.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); 

我會很感激你的幫助。任何建議?

回答

-1

我知道這個帖子是舊的,但答案可能對其他人有用。 在使用預測之前,您必須在神經元網絡中添加圖層。

e.g:

// define the parameters for the neural network (MLP) 

// set the network to be 3 layer 256->10->10 
// - one input node per attribute in a sample 
// - 10 hidden nodes 
// - one output node per class 

int layers_d[] = { attributes_per_sample, 10, number_of_classes}; 
CvMat* layers = cvCreateMatHeader(1,3,CV_32SC1); 
cvInitMatHeader(layers, 1,3,CV_32SC1, layers_d); 

// create the network using a sigmoid function with alpha and beta 
// parameters 0.6 and 1 specified respectively (refer to manual) 

CvANN_MLP* nnetwork = new CvANN_MLP; 
nnetwork->create(layers, CvANN_MLP::SIGMOID_SYM, 0.6, 1); 

來源:https://github.com/arnaudgelas/OpenCVExamples/blob/master/NeuralNetwork/NeuralNetwork.cpp

+0

不幸的是,你的解決方案是過時的,你不應該推薦使用的OpenCV的不再有維持C-API給任何人在這裏。 – berak

+0

你的意思是轉換CvMat *圖層= cvCreateMatHeader(1,3,CV_32SC1);到Mat *圖層=新的Mat(1,3,CV_32SC1);例如 ? – Kust

相關問題