add train cpp and train data.

1.3
Fenix 11 years ago
parent e4e31b1fbf
commit a80b793eba

@ -78,6 +78,7 @@
<ItemGroup>
<None Include="model\ann.xml" />
<None Include="model\svm.xml" />
<None Include="train\训练说明.txt" />
<None Include="关于版权.txt" />
</ItemGroup>
<ItemGroup>

@ -24,6 +24,7 @@
<None Include="关于版权.txt">
<Filter>资源文件</Filter>
</None>
<None Include="train\训练说明.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\cpp\chars_identify.cpp">

File diff suppressed because it is too large Load Diff

@ -0,0 +1,129 @@
// SVMTrain.cpp : 定义控制台应用程序的入口点。
#include <iostream>
#include <cstdlib>
#include <io.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cvaux.h>
using namespace std;
using namespace cv;
void getFiles( string path, vector<string>& files )
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if((fileinfo.attrib & _A_SUBDIR))
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
getFiles( p.assign(path).append("\\").append(fileinfo.name), files );
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
void getPlate(Mat& trainingImages, vector<int>& trainingLabels)
{
char * filePath = "train/data/plate_detect_svm/HasPlate/HasPlate";
vector<string> files;
////获取该路径下的所有文件
getFiles(filePath, files );
int size = files.size();
if (0 == size)
cout << "No File Found in train HasPlate!" << endl;
for (int i = 0;i < size;i++)
{
cout << files[i].c_str() << endl;
Mat img = imread(files[i].c_str());
//img= img.reshape(1, 1);
img= img.reshape(1, 1);
trainingImages.push_back(img);
trainingLabels.push_back(1);
}
}
void getNoPlate(Mat& trainingImages, vector<int>& trainingLabels)
{
char * filePath = "train/data/plate_detect_svm/NoPlate/NoPlate";
vector<string> files;
////获取该路径下的所有文件
getFiles(filePath, files );
int size = files.size();
if (0 == size)
cout << "No File Found in train NoPlate!" << endl;
for (int i = 0;i < size;i++)
{
cout << files[i].c_str() << endl;
Mat img = imread(files[i].c_str());
//img= img.reshape(1, 1);
img= img.reshape(1, 1);
trainingImages.push_back(img);
trainingLabels.push_back(0);
}
}
int main()
{
Mat classes;//(numPlates+numNoPlates, 1, CV_32FC1);
Mat trainingData;//(numPlates+numNoPlates, imageWidth*imageHeight, CV_32FC1 );
Mat trainingImages;
vector<int> trainingLabels;
getPlate(trainingImages, trainingLabels);
getNoPlate(trainingImages, trainingLabels);
Mat(trainingImages).copyTo(trainingData);
trainingData.convertTo(trainingData, CV_32FC1);
Mat(trainingLabels).copyTo(classes);
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);
//Train SVM
cout << "Begin to generate svm" << endl;
CvSVM svmClassifier(trainingData, classes, Mat(), Mat(), SVM_params);
cout << "Svm generate done!" << endl;
FileStorage fsTo("train/svm.xml", cv::FileStorage::WRITE);
svmClassifier.write(*fsTo, "svm");
int a;
cin >> a;
return 0;
}

@ -0,0 +1,4 @@
要训练时把这两个cpp文件引入到VS项目中即可。
数据在data文件夹下svm对应Plate_detectann对应chars_recognise。要先解压然后放置到正确的路径下或者
你可以修改cpp文件中的文件夹路径。

@ -1,6 +1,4 @@
虽然在程序根目录下有“license”但是考虑到国人的习惯在这里再做个申明。
EasyPR使用的是Apache V2开源协议是一个对商用友好的协议。
你可以使用EasyPR进行后续开发并用做商业目的。
如果你的产品中引用了EasyPR的代码请明确说明代码修改自EasyPR谢谢
EasyPR使用的是Apache V2开源协议是一个对商用友好的协议。你可以使用EasyPR进行后续开发并用做商业目的。但是这不意味着你可以完全无视EasyPR的版权并且占为己有。
例如你可以在销售时说明使用了开源库EasyPR但是你不能一边卖着这套产品一边说完全“自主开发”。这是不被允许的
作者和其团队保留对EasyPR的所有权利。
Loading…
Cancel
Save