9-1-4光學字元訓練辨識(類神經)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include vector>
#include algorithm>
const int numCharacters = 30;
const char strCharacters[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z' };
void train(CvANN_MLP& ann, cv::Mat TrainData, cv::Mat classes, int nlayers)
{
cv::Mat layers(1, 3, CV_32SC1);
layers.at
layers.at
layers.at
ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1);
//Prepare trainClases
//Create a mat with n trained data by m classes
cv::Mat trainClasses;
trainClasses.create(TrainData.rows, numCharacters, CV_32FC1);
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
trainClasses.at
else
trainClasses.at
}
}
cv::Mat weights(1, TrainData.rows, CV_32FC1, cv::Scalar::all(1));
//Learn classifier
ann.train(TrainData, trainClasses, weights);
}
#define HORIZONTAL 1
#define VERTICAL 0
cv::Mat ProjectedHistogram(cv::Mat img, int t)
{
int sz = (t) ? img.rows : img.cols;
cv::Mat mhist = cv::Mat::zeros(1, sz, CV_32F);
for (int j = 0; j
mhist.at
}
//Normalize histogram
double min, max;
minMaxLoc(mhist, &min, &max);
if (max>0)
mhist.convertTo(mhist, -1, 1.0f / max, 0);
return mhist;
}
int main(int argc, char** argv)
{
cv::Mat numImg = cv::imread("file0.bmp", 0);
cv::Mat map_x, map_y;
map_x.create(numImg.size(), CV_32FC1);
map_y.create(numImg.size(), CV_32FC1);
cv::Mat numImgProce;
for (int i = 0; i < numImg.rows; i++)
{
for (int j = 0; j < numImg.cols; j++)
{
if (j > numImg.cols*0.15 && j < numImg.cols*0.85)
{
map_x.at
}
else
{
map_x.at
}
map_y.at
}
}
cv::remap(numImg, numImgProce, map_x, map_y, CV_INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0));
numImg = numImgProce.clone();
cv::imwrite("input.jpg", numImg);
if (!numImg.data)
{
std::cout << "無法讀取圖片" << std::endl;
return -1;
}
CvANN_MLP ann;
cv::FileStorage fs;
fs.open("OCR.xml", cv::FileStorage::READ);
cv::Mat TrainingData;
cv::Mat Classes;
fs["TrainingDataF15"] >> TrainingData;
fs["classes"] >> Classes;
train(ann, TrainingData, Classes, 10);
cv::Mat vhist = ProjectedHistogram(numImg, VERTICAL);
cv::Mat hhist = ProjectedHistogram(numImg, HORIZONTAL);
//Low data feature
cv::Mat lowData;
cv::resize(numImg, lowData, cv::Size(15, 15));
//Last 10 is the number of moments components
int numCols = vhist.cols + hhist.cols + lowData.cols*lowData.cols;
cv::Mat out = cv::Mat::zeros(1, numCols, CV_32F);
//Asign values to feature
int j = 0;
for (int i = 0; i
out.at
j++;
}
for (int i = 0; i
out.at
j++;
}
for (int x = 0; x
for (int y = 0; y
j++;
}
}
int resultClass = -1;
cv::Mat output(1, numCharacters, CV_32FC1);
ann.predict(out, output);
cv::Point maxLoc;
double maxVal;
minMaxLoc(output, 0, &maxVal, 0, &maxLoc);
resultClass = maxLoc.x;
char resultChar = strCharacters[resultClass];
std::cout << "result is: " << resultChar << std::endl;
return 0;
}