上一篇介绍了ANPR相关原理方面的,本文结合代码具体说明ANPR过程。
项目解决方案:
trainSVM用来生成下面的SVM.xml; trainOCR用来生成OCR.xml。evalOCR.cpp是用来评估结果性能。
先看下main()
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
#include <ml.h>
#include <iostream>
#include <vector>
#include "DetectRegions.h"
#include "OCR.h"
using namespace std;
using namespace cv;
string getFilename(string s) {
char sep = '/';
char sepExt='.';
#ifdef _WIN32
sep = '\\';
#endif
size_t i = s.rfind(sep, s.length( ));//rfind是反向查找,因此找到的是最后一个"//"
if (i != string::npos )
{
string fn= (s.substr(i+1, s.length() - i) );
size_t j = fn.rfind(sepExt, fn.length( ));
if (i != string::npos)
{
return fn.substr(0,j);
}
else
return fn;
}
else{
return "";
}
}
int main()
{
cout << "OpenCV Automatic Number Plate Recognition\n";
char* filename = (char*)"9773BNB.jpg";
Mat input_image;
input_image = imread("9773BNB.jpg");
string filename_whithoutExt = getFilename(filename);
cout << "working with file: "<< filename_whithoutExt << "\n";
DetectRegions detectRegions;
detectRegions.setFilename(filename_whithoutExt);
detectRegions.saveRegions = false;
detectRegions.showSteps = true;
vector<Plate> posible_regions= detectRegions.run( input_image ); //对输入图像input_image找出可能的连通块 posible_regions
FileStorage fs;
fs.open("SVM.xml", FileStorage::READ);
Mat SVM_TrainingData;
Mat SVM_Classes;
fs["TrainingData"] >> SVM_TrainingData;
fs["classes"] >> SVM_Classes;
//设置SVM参数
CvSVMParams SVM_params;
SVM_params.svm_type = CvSVM::C_SVC;
SVM_params.kernel_type = CvSVM::LINEAR; //CvSVM::LINEAR;
SVM_params.degree = 0;
SVM_params.gamma = 1;
SVM_params.coef0 = 0;
SVM_params.C = 1;
SVM_params.nu = 0;
SVM_params.p = 0;
SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
CvSVM svmClassifier(SVM_TrainingData, SVM_Classes, Mat(), Mat(), SVM_params