diff --git a/README.md b/README.md index 3ae7deb..4901126 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ EasyPR最开始是发布在[GitHub](https://github.com/liuruoze/EasyPR)上的, ### 更新 -* EasyPR最新的版本是1.1.1。相比上一个版本,本版本主要做了一些调整与bug修复,增加了一个命令行操作功能(由Micooz开发)。 +* EasyPR最新的版本是1.1.1。相比上一个版本,本版本主要做了一些调整与bug修复,增加了一个命令行操作功能(由Micooz开发),对字符训练数据集进行了修复,替换rar类型到7z类型(因为可以节省更多的空间)。 * 除此之外,本版本最大的改动是在GDTS里增加了若干张新的测试数据集,这些数据集是用来测试EasyPR在不同环境下的鲁棒性的(目前看来效果不好,1.2版本会想办法优化)。 diff --git a/src/train/ann_train.cpp b/src/train/ann_train.cpp index 4e74196..91a25fd 100644 --- a/src/train/ann_train.cpp +++ b/src/train/ann_train.cpp @@ -35,19 +35,19 @@ CvANN_MLP ann; //中国车牌 const char strCharacters[] = {'0','1','2','3','4','5',\ - '6','7','8','9','A','B', 'C', 'D', 'E','F', 'G', 'H', /* 没有I */\ - 'J', 'K', 'L', 'M', 'N', /* 没有O */ 'P', 'Q', 'R', 'S', 'T', \ - 'U','V', 'W', 'X', 'Y', 'Z'}; -const int numCharacter = 34; /* 没有I和0,10个数字与24个英文字符之和 */ + '6','7','8','9','A','B', 'C', 'D', 'E','F', 'G', 'H', /* 没有I */\ + 'J', 'K', 'L', 'M', 'N', /* 没有O */ 'P', 'Q', 'R', 'S', 'T', \ + 'U','V', 'W', 'X', 'Y', 'Z'}; +const int numCharacter = 34; /* 没有I和O,10个数字与24个英文字符之和 */ //以下都是我训练时用到的中文字符数据,并不全面,有些省份没有训练数据所以没有字符 //有些后面加数字2的表示在训练时常看到字符的一种变形,也作为训练数据存储 const string strChinese[] = {"zh_cuan" /* 川 */, "zh_e" /* 鄂 */, "zh_gan" /* 赣*/, \ - "zh_hei" /* 黑 */, "zh_hu" /* 沪 */, "zh_ji" /* 冀 */, \ - "zh_jl" /* 吉 */, "zh_jin" /* 津 */, "zh_jing" /* 京 */, "zh_shan" /* 陕 */, \ - "zh_liao" /* 辽 */, "zh_lu" /* 鲁 */, "zh_min" /* 闽 */, "zh_ning" /* 宁 */, \ - "zh_su" /* 苏 */, "zh_sx" /* 晋 */, "zh_wan" /* 皖 */,\ - "zh_yu" /* 豫 */, "zh_yue" /* 粤 */, "zh_zhe" /* 浙 */}; + "zh_hei" /* 黑 */, "zh_hu" /* 沪 */, "zh_ji" /* 冀 */, \ + "zh_jl" /* 吉 */, "zh_jin" /* 津 */, "zh_jing" /* 京 */, "zh_shan" /* 陕 */, \ + "zh_liao" /* 辽 */, "zh_lu" /* 鲁 */, "zh_min" /* 闽 */, "zh_ning" /* 宁 */, \ + "zh_su" /* 苏 */, "zh_sx" /* 晋 */, "zh_wan" /* 皖 */,\ + "zh_yu" /* 豫 */, "zh_yue" /* 粤 */, "zh_zhe" /* 浙 */}; const int numChinese = 20; const int numAll = 54; /* 34+20=54 */ @@ -56,146 +56,146 @@ const int numNeurons = 20; const int predictSize = 10; Mat features(Mat in, int sizeData){ - //Histogram features - Mat vhist=ProjectedHistogram(in,VERTICAL); - Mat hhist=ProjectedHistogram(in,HORIZONTAL); - - //Low data feature - Mat lowData; - resize(in, lowData, Size(sizeData, sizeData) ); - - //Last 10 is the number of moments components - int numCols=vhist.cols+hhist.cols+lowData.cols*lowData.cols; - - Mat out=Mat::zeros(1,numCols,CV_32F); - //Asign values to feature,ANN的样本特征为水平、垂直直方图和低分辨率图像所组成的矢量 - int j=0; - for(int i=0; i(j)=vhist.at(i); - j++; - } - for(int i=0; i(j)=hhist.at(i); - j++; - } - for(int x=0; x(j)=(float)lowData.at(x,y); - j++; - } - } - //if(DEBUG) - // cout << out << "\n===========================================\n"; - return out; + //Histogram features + Mat vhist=ProjectedHistogram(in,VERTICAL); + Mat hhist=ProjectedHistogram(in,HORIZONTAL); + + //Low data feature + Mat lowData; + resize(in, lowData, Size(sizeData, sizeData) ); + + //Last 10 is the number of moments components + int numCols=vhist.cols+hhist.cols+lowData.cols*lowData.cols; + + Mat out=Mat::zeros(1,numCols,CV_32F); + //Asign values to feature,ANN的样本特征为水平、垂直直方图和低分辨率图像所组成的矢量 + int j=0; + for(int i=0; i(j)=vhist.at(i); + j++; + } + for(int i=0; i(j)=hhist.at(i); + j++; + } + for(int x=0; x(j)=(float)lowData.at(x,y); + j++; + } + } + //if(DEBUG) + // cout << out << "\n===========================================\n"; + return out; } void annTrain(Mat TrainData, Mat classes, int nNeruns) { - ann.clear(); - Mat layers(1, 3, CV_32SC1); - layers.at(0) = TrainData.cols; - layers.at(1) = nNeruns; - layers.at(2) = numAll; - 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, numAll, 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(i) ) - trainClasses.at(i,k) = 1; - else - trainClasses.at(i,k) = 0; - } - } - Mat weights( 1, TrainData.rows, CV_32FC1, Scalar::all(1) ); - - //Learn classifier - ann.train( TrainData, trainClasses, weights ); + ann.clear(); + Mat layers(1, 3, CV_32SC1); + layers.at(0) = TrainData.cols; + layers.at(1) = nNeruns; + layers.at(2) = numAll; + 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, numAll, 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(i) ) + trainClasses.at(i,k) = 1; + else + trainClasses.at(i,k) = 0; + } + } + Mat weights( 1, TrainData.rows, CV_32FC1, Scalar::all(1) ); + + //Learn classifier + ann.train( TrainData, trainClasses, weights ); } int saveTrainData() { - cout << "Begin saveTrainData" << endl; + cout << "Begin saveTrainData" << endl; Mat classes; Mat trainingDataf5; Mat trainingDataf10; Mat trainingDataf15; Mat trainingDataf20; - + vector trainingLabels; - string path = "train/data/chars_recognise_ann/chars2/chars2"; - + string path = "train/data/chars_recognise_ann/chars2/chars2"; + for(int i = 0; i < numCharacter; i++) { - cout << "Character: "<< strCharacters[i] << "\n"; + cout << "Character: "<< strCharacters[i] << "\n"; stringstream ss(stringstream::in | stringstream::out); ss << path << "/" << strCharacters[i]; - - vector files; - getFiles(ss.str(), files); - - int size = files.size(); - for (int j = 0; j < size; j++) - { - cout << files[j].c_str() << endl; - Mat img = imread(files[j].c_str(), 0); + + vector files; + getFiles(ss.str(), files); + + int size = files.size(); + for (int j = 0; j < size; j++) + { + cout << files[j].c_str() << endl; + Mat img = imread(files[j].c_str(), 0); Mat f5=features(img, 5); Mat f10=features(img, 10); Mat f15=features(img, 15); Mat f20=features(img, 20); - + trainingDataf5.push_back(f5); trainingDataf10.push_back(f10); trainingDataf15.push_back(f15); trainingDataf20.push_back(f20); trainingLabels.push_back(i); //每一幅字符图片所对应的字符类别索引下标 - } + } } - - path = "train/data/chars_recognise_ann/charsChinese/charsChinese"; - - for (int i = 0; i < numChinese; i++) - { - cout << "Character: "<< strChinese[i] << "\n"; - stringstream ss(stringstream::in | stringstream::out); + + path = "train/data/chars_recognise_ann/charsChinese/charsChinese"; + + for (int i = 0; i < numChinese; i++) + { + cout << "Character: "<< strChinese[i] << "\n"; + stringstream ss(stringstream::in | stringstream::out); ss << path << "/" << strChinese[i]; - - vector files; - getFiles(ss.str(), files); - - int size = files.size(); - for (int j = 0; j < size; j++) - { - cout << files[j].c_str() << endl; - Mat img = imread(files[j].c_str(), 0); + + vector files; + getFiles(ss.str(), files); + + int size = files.size(); + for (int j = 0; j < size; j++) + { + cout << files[j].c_str() << endl; + Mat img = imread(files[j].c_str(), 0); Mat f5=features(img, 5); Mat f10=features(img, 10); Mat f15=features(img, 15); Mat f20=features(img, 20); - + trainingDataf5.push_back(f5); trainingDataf10.push_back(f10); trainingDataf15.push_back(f15); trainingDataf20.push_back(f20); - trainingLabels.push_back(i + numCharacter); - } - } - + trainingLabels.push_back(i + numCharacter); + } + } + trainingDataf5.convertTo(trainingDataf5, CV_32FC1); trainingDataf10.convertTo(trainingDataf10, CV_32FC1); trainingDataf15.convertTo(trainingDataf15, CV_32FC1); trainingDataf20.convertTo(trainingDataf20, CV_32FC1); Mat(trainingLabels).copyTo(classes); - + FileStorage fs("train/ann_data.xml", FileStorage::WRITE); fs << "TrainingDataF5" << trainingDataf5; fs << "TrainingDataF10" << trainingDataf10; @@ -203,84 +203,77 @@ int saveTrainData() fs << "TrainingDataF20" << trainingDataf20; fs << "classes" << classes; fs.release(); - - cout << "End saveTrainData" << endl; - + + cout << "End saveTrainData" << endl; + return 0; } void saveModel(int _predictsize, int _neurons) { - FileStorage fs; - fs.open("train/ann_data.xml", FileStorage::READ); - - Mat TrainingData; - Mat Classes; - - string training; - if(1) - { - stringstream ss(stringstream::in | stringstream::out); - ss << "TrainingDataF" << _predictsize; - training = ss.str(); - } - - fs[training] >> TrainingData; - fs["classes"] >> Classes; - - //train the Ann - cout << "Begin to saveModelChar predictSize:" << _predictsize - << " neurons:" << _neurons << endl; + FileStorage fs; + fs.open("train/ann_data.xml", FileStorage::READ); + + Mat TrainingData; + Mat Classes; + + string training; + if(1) + { + stringstream ss(stringstream::in | stringstream::out); + ss << "TrainingDataF" << _predictsize; + training = ss.str(); + } + + fs[training] >> TrainingData; + fs["classes"] >> Classes; + + //train the Ann + cout << "Begin to saveModelChar predictSize:" << _predictsize + << " neurons:" << _neurons << endl; -#if defined (__APPLE__) - double start = getTickCount(); - annTrain(TrainingData, Classes, _neurons); - double end = getTickCount(); -#else double start = GetTickCount(); annTrain(TrainingData, Classes, _neurons); double end = GetTickCount(); -#endif - cout << "GetTickCount:" << (end-start)/1000 << endl; - - cout << "End the saveModelChar" << endl; - - string model_name = "train/ann.xml"; - //if(1) - //{ - // stringstream ss(stringstream::in | stringstream::out); - // ss << "ann_prd" << _predictsize << "_neu"<< _neurons << ".xml"; - // model_name = ss.str(); - //} - - FileStorage fsTo(model_name, cv::FileStorage::WRITE); - ann.write(*fsTo, "ann"); + + cout << "End the saveModelChar" << endl; + + string model_name = "train/ann.xml"; + //if(1) + //{ + // stringstream ss(stringstream::in | stringstream::out); + // ss << "ann_prd" << _predictsize << "_neu"<< _neurons << ".xml"; + // model_name = ss.str(); + //} + + FileStorage fsTo(model_name, cv::FileStorage::WRITE); + ann.write(*fsTo, "ann"); } int annMain() { - cout << "To be begin." << endl; - - saveTrainData(); - - //可根据需要训练不同的predictSize或者neurons的ANN模型 - //for (int i = 2; i <= 2; i ++) - //{ - // int size = i * 5; - // for (int j = 5; j <= 10; j++) - // { - // int neurons = j * 10; - // saveModel(size, neurons); - // } - //} - - //这里演示只训练model文件夹下的ann.xml,此模型是一个predictSize=10,neurons=40的ANN模型。 - //根据机器的不同,训练时间不一样,但一般需要10分钟左右,所以慢慢等一会吧。 - saveModel(10, 40); - - cout << "To be end." << endl; - int end; - cin >> end; + cout << "To be begin." << endl; + + saveTrainData(); + + //可根据需要训练不同的predictSize或者neurons的ANN模型 + //for (int i = 2; i <= 2; i ++) + //{ + // int size = i * 5; + // for (int j = 5; j <= 10; j++) + // { + // int neurons = j * 10; + // saveModel(size, neurons); + // } + //} + + //这里演示只训练model文件夹下的ann.xml,此模型是一个predictSize=10,neurons=40的ANN模型。 + //根据机器的不同,训练时间不一样,但一般需要10分钟左右,所以慢慢等一会吧。 + saveModel(10, 40); + + cout << "To be end." << endl; + int end; + cin >> end; return 0; -} +} \ No newline at end of file diff --git a/src/util/mc_data_prepare.cpp b/src/util/mc_data_prepare.cpp index 8fb94f6..315bb8c 100644 --- a/src/util/mc_data_prepare.cpp +++ b/src/util/mc_data_prepare.cpp @@ -1,4 +1,4 @@ -// mc_data_prepare.cpp : +// mc_data_prepare.cpp : // 数据预处理的程序,主要做以下两件事 // 1.读取原生数据 rawdata,这可能有数百万张 // 2.随机/选择性地选取部分数据成为learndata,这个根据参数设置,一般设置为1000,10000,或者1百万 @@ -20,7 +20,7 @@ using namespace std; using namespace cv; -const int LEARANDATA_COUNT = 1000; +const int LEARANDATA_COUNT = 5000; void getFiles( string path, vector& files ); void SplitString(const string& s, vector& v, const string& c); @@ -30,254 +30,254 @@ map mc_map; void Code2Province(const string& code, string& province) { - if (mc_map.empty()) - { - mc_map.insert(pair("E00","未识别")); - mc_map.insert(pair("A01","京")); - mc_map.insert(pair("A02","津")); - mc_map.insert(pair("A03","沪")); - mc_map.insert(pair("A04","渝")); - mc_map.insert(pair("B01","桂")); - mc_map.insert(pair("B02","蒙")); - mc_map.insert(pair("B03","宁")); - mc_map.insert(pair("B04","新")); - mc_map.insert(pair("B05","藏")); - mc_map.insert(pair("S01","皖")); - mc_map.insert(pair("S02","闽")); - mc_map.insert(pair("S03","粤")); - mc_map.insert(pair("S04","甘")); - mc_map.insert(pair("S05","贵")); - mc_map.insert(pair("S06","鄂")); - mc_map.insert(pair("S07","冀")); - mc_map.insert(pair("S08","黑")); - mc_map.insert(pair("S09","湘")); - mc_map.insert(pair("S10","豫")); - mc_map.insert(pair("S11","琼")); - mc_map.insert(pair("S12","吉")); - mc_map.insert(pair("S13","苏")); - mc_map.insert(pair("S14","赣")); - mc_map.insert(pair("S15","辽")); - mc_map.insert(pair("S16","青")); - mc_map.insert(pair("S17","川")); - mc_map.insert(pair("S18","鲁")); - mc_map.insert(pair("S19","陕")); - mc_map.insert(pair("S20","晋")); - mc_map.insert(pair("S21","云")); - mc_map.insert(pair("S22","浙")); - mc_map.insert(pair("J01","军")); - mc_map.insert(pair("J02","海")); - mc_map.insert(pair("J03","空")); - mc_map.insert(pair("J04","北")); - mc_map.insert(pair("J05","成")); - mc_map.insert(pair("J06","广")); - mc_map.insert(pair("J07","济")); - mc_map.insert(pair("J08","兰")); - mc_map.insert(pair("J09","南")); - mc_map.insert(pair("J10","沈")); - } - - if (mc_map.count(code)) - province = mc_map[code]; - else - province = "无"; + if (mc_map.empty()) + { + mc_map.insert(pair("E00","未识别")); + mc_map.insert(pair("A01","京")); + mc_map.insert(pair("A02","津")); + mc_map.insert(pair("A03","沪")); + mc_map.insert(pair("A04","渝")); + mc_map.insert(pair("B01","桂")); + mc_map.insert(pair("B02","蒙")); + mc_map.insert(pair("B03","宁")); + mc_map.insert(pair("B04","新")); + mc_map.insert(pair("B05","藏")); + mc_map.insert(pair("S01","皖")); + mc_map.insert(pair("S02","闽")); + mc_map.insert(pair("S03","粤")); + mc_map.insert(pair("S04","甘")); + mc_map.insert(pair("S05","贵")); + mc_map.insert(pair("S06","鄂")); + mc_map.insert(pair("S07","冀")); + mc_map.insert(pair("S08","黑")); + mc_map.insert(pair("S09","湘")); + mc_map.insert(pair("S10","豫")); + mc_map.insert(pair("S11","琼")); + mc_map.insert(pair("S12","吉")); + mc_map.insert(pair("S13","苏")); + mc_map.insert(pair("S14","赣")); + mc_map.insert(pair("S15","辽")); + mc_map.insert(pair("S16","青")); + mc_map.insert(pair("S17","川")); + mc_map.insert(pair("S18","鲁")); + mc_map.insert(pair("S19","陕")); + mc_map.insert(pair("S20","晋")); + mc_map.insert(pair("S21","云")); + mc_map.insert(pair("S22","浙")); + mc_map.insert(pair("J01","军")); + mc_map.insert(pair("J02","海")); + mc_map.insert(pair("J03","空")); + mc_map.insert(pair("J04","北")); + mc_map.insert(pair("J05","成")); + mc_map.insert(pair("J06","广")); + mc_map.insert(pair("J07","济")); + mc_map.insert(pair("J08","兰")); + mc_map.insert(pair("J09","南")); + mc_map.insert(pair("J10","沈")); + } + + if (mc_map.count(code)) + province = mc_map[code]; + else + province = "无"; } //MC:切去上部与底部干扰的细节 Mat cutBottom(Mat img) { - int width = img.size().width; - int height = img.size().height; - Rect rect(0, 0.00, width*1, height*0.97); - Mat dst = img(rect); - return dst; + int width = img.size().width; + int height = img.size().height; + Rect rect(0, 0.00, width*1, height*0.97); + Mat dst = img(rect); + return dst; } //MC:filepath示例:F:\data\easypr-data\learndata\20150110132005-210028-S18-H3952K.jpg bool isNotNight(const string& filepath) { - vector spilt_path; - SplitString(filepath, spilt_path, "\\"); - - int spiltsize = spilt_path.size(); - string filename = ""; - if (spiltsize != 0) - { - filename = spilt_path[spiltsize-1]; - if (filename != "") - { - vector spilt_name; - SplitString(filename, spilt_name, "-"); - - int name_size = spilt_name.size(); - string datestr = ""; - if (name_size != 0) - { - datestr = spilt_name[0]; - if (datestr != "") - { - //"20150110132005", 时间在第6,7个位置 - //将早上10点到下午2点的图片截取出来 - string hourstr = datestr.substr(8, 2); - if ( hourstr <= "14" && hourstr >= "10") - return true; - } - } - } - } - - return false; + vector spilt_path; + SplitString(filepath, spilt_path, "\\"); + + int spiltsize = spilt_path.size(); + string filename = ""; + if (spiltsize != 0) + { + filename = spilt_path[spiltsize-1]; + if (filename != "") + { + vector spilt_name; + SplitString(filename, spilt_name, "-"); + + int name_size = spilt_name.size(); + string datestr = ""; + if (name_size != 0) + { + datestr = spilt_name[0]; + if (datestr != "") + { + //"20150110132005", 时间在第6,7个位置 + //将早上10点到下午2点的图片截取出来 + string hourstr = datestr.substr(8, 2); + if ( hourstr <= "14" && hourstr >= "10") + return true; + } + } + } + } + + return false; } //! MC:将rawdata的文件换个路径到learndata里 bool getNewPath(const string& filepath, string& newfilepath) { - string writePath = "F:/data/easypr-data/learndata/"; - vector spilt_path; - SplitString(filepath, spilt_path, "\\"); - - int spiltsize = spilt_path.size(); - string filename = ""; - if (spiltsize != 0) - { - filename = spilt_path[spiltsize-1]; - newfilepath = writePath + filename; - return true; - } - return false; + string writePath = "F:/data/easypr-data/learndata_dl/"; + vector spilt_path; + SplitString(filepath, spilt_path, "\\"); + + int spiltsize = spilt_path.size(); + string filename = ""; + if (spiltsize != 0) + { + filename = spilt_path[spiltsize-1]; + newfilepath = writePath + filename; + return true; + } + return false; } //! MC:通过filepath获取车牌号码 void getPlateLicense(const string& filepath, string& plateLicense) { - vector spilt_path; - SplitString(filepath, spilt_path, "\\"); - - int spiltsize = spilt_path.size(); - string filename = ""; - if (spiltsize != 0) - { - filename = spilt_path[spiltsize-1]; - if (filename != "") - { - vector spilt_name; - SplitString(filename, spilt_name, "-"); - - int name_size = spilt_name.size(); - string plateStr = ""; - string provinceCode = ""; - string provinceStr = ""; - if (name_size != 0) - { - // plateStr是最后一个字符串,包括后面的".jpg" - plateStr = spilt_name[name_size-1]; - - // 将".jpg"去掉 - vector spilt_plate; - SplitString(plateStr, spilt_plate, "."); - int plate_size = spilt_plate.size(); - string rawplate = ""; - if (plate_size != 0) - { - rawplate = spilt_plate[0]; - } - - // provinceStr是倒数第二个字符串,主要是"S13"代表"苏" - provinceCode = spilt_name[name_size-2]; - Code2Province(provinceCode, provinceStr); - plateLicense = provinceStr + rawplate; - } - } - } + vector spilt_path; + SplitString(filepath, spilt_path, "\\"); + + int spiltsize = spilt_path.size(); + string filename = ""; + if (spiltsize != 0) + { + filename = spilt_path[spiltsize-1]; + if (filename != "") + { + vector spilt_name; + SplitString(filename, spilt_name, "-"); + + int name_size = spilt_name.size(); + string plateStr = ""; + string provinceCode = ""; + string provinceStr = ""; + if (name_size != 0) + { + // plateStr是最后一个字符串,包括后面的".jpg" + plateStr = spilt_name[name_size-1]; + + // 将".jpg"去掉 + vector spilt_plate; + SplitString(plateStr, spilt_plate, "."); + int plate_size = spilt_plate.size(); + string rawplate = ""; + if (plate_size != 0) + { + rawplate = spilt_plate[0]; + } + + // provinceStr是倒数第二个字符串,主要是"S13"代表"苏" + provinceCode = spilt_name[name_size-2]; + Code2Province(provinceCode, provinceStr); + plateLicense = provinceStr + rawplate; + } + } + } } //! MC:将rawdata截取部分数据到learndata中 void getLearnData() { - const char * filePath = "F:/data/easypr-data/rawdata"; - - ////获取该路径下的所有文件 - vector files; - getFiles(filePath, files ); - - int size = files.size(); + const char * filePath = "F:/data/easypr-data/rawdata"; + + ////获取该路径下的所有文件 + vector files; + getFiles(filePath, files ); + + int size = files.size(); if (0 == size) { - cout << "File not found in " << filePath << endl; + cout << "File not found in " << filePath << endl; return; } - ////随机排列rawdata - srand(unsigned(time(NULL))); - random_shuffle(files.begin(), files.end()); - - ////选取前LEARANDATA_COUNT个rawdata数据作为learndata - int boundry = LEARANDATA_COUNT; - int count = 0; - cout << "Learndata saved!" << endl; - for (int i = 0; i < size; i++) - { - cout << files[i].c_str() << endl; - string filepath = files[i].c_str(); - - //只处理白天的数据 - if (isNotNight(filepath)!=true) - continue; - - //读取数据,并对图片进行预处理 - Mat img = imread(filepath); - img = cutBottom(img); - - //存储路径替换为新的 - string newfilepath = ""; - getNewPath(filepath, newfilepath); - - if(1) - { - stringstream ss(stringstream::in | stringstream::out); - ss << newfilepath; - imwrite(ss.str(), img); - } - - count++; - if (count >= boundry) - break; - } + ////随机排列rawdata + srand(unsigned(time(NULL))); + random_shuffle(files.begin(), files.end()); + + ////选取前LEARANDATA_COUNT个rawdata数据作为learndata + int boundry = LEARANDATA_COUNT; + int count = 0; + cout << "Learndata saved!" << endl; + for (int i = 0; i < size; i++) + { + cout << files[i].c_str() << endl; + string filepath = files[i].c_str(); + + //只处理白天的数据 + //if (isNotNight(filepath)!=true) + // continue; + + //读取数据,并对图片进行预处理 + Mat img = imread(filepath); + img = cutBottom(img); + + //存储路径替换为新的 + string newfilepath = ""; + getNewPath(filepath, newfilepath); + + if(1) + { + stringstream ss(stringstream::in | stringstream::out); + ss << newfilepath; + imwrite(ss.str(), img); + } + + count++; + if (count >= boundry) + break; + } } //! 将文件名称替换,重点是MC的code替换为province void changeFileName() { - //char * filePath = "F:/data/easypr-data/learndata"; - char * filePath = "F:/data/PlateLocate/pic1"; - - ////获取该路径下的所有文件 - vector files; - getFiles(filePath, files ); - - int size = files.size(); - if (0 == size) - cout << "No File Found in learndata!" << endl; - - for (int i = 0; i < size; i++) - { - cout << files[i].c_str() << endl; - string filepath = files[i].c_str(); - - //读取数据,并对图片进行预处理 - Mat img = imread(filepath); - img = cutBottom(img); - - string writePath = "F:/data/easypr-data/learn_2/"; - string plateLicense = ""; - getPlateLicense(filepath, plateLicense); - - if(1) - { - stringstream ss(stringstream::in | stringstream::out); - ss << writePath << plateLicense << ".jpg"; - imwrite(ss.str(), img); - } - - } -} + //char * filePath = "F:/data/easypr-data/learndata"; + char * filePath = "F:/data/PlateLocate/pic1"; + + ////获取该路径下的所有文件 + vector files; + getFiles(filePath, files ); + + int size = files.size(); + if (0 == size) + cout << "No File Found in learndata!" << endl; + + for (int i = 0; i < size; i++) + { + cout << files[i].c_str() << endl; + string filepath = files[i].c_str(); + + //读取数据,并对图片进行预处理 + Mat img = imread(filepath); + img = cutBottom(img); + + string writePath = "F:/data/easypr-data/learn_2/"; + string plateLicense = ""; + getPlateLicense(filepath, plateLicense); + + if(1) + { + stringstream ss(stringstream::in | stringstream::out); + ss << writePath << plateLicense << ".jpg"; + imwrite(ss.str(), img); + } + + } +} \ No newline at end of file diff --git a/train/data/chars_recognise_ann/chars2.7z b/train/data/chars_recognise_ann/chars2.7z new file mode 100644 index 0000000..76033f7 Binary files /dev/null and b/train/data/chars_recognise_ann/chars2.7z differ diff --git a/train/data/chars_recognise_ann/chars2.rar b/train/data/chars_recognise_ann/chars2.rar deleted file mode 100644 index 13798fd..0000000 Binary files a/train/data/chars_recognise_ann/chars2.rar and /dev/null differ diff --git a/train/data/chars_recognise_ann/charsChinese.7z b/train/data/chars_recognise_ann/charsChinese.7z new file mode 100644 index 0000000..3796f66 Binary files /dev/null and b/train/data/chars_recognise_ann/charsChinese.7z differ diff --git a/train/data/chars_recognise_ann/charsChinese.rar b/train/data/chars_recognise_ann/charsChinese.rar deleted file mode 100644 index c639a5e..0000000 Binary files a/train/data/chars_recognise_ann/charsChinese.rar and /dev/null differ