700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Opencv3.0 手写数字识别(Hog特征+SVM分类器)

Opencv3.0 手写数字识别(Hog特征+SVM分类器)

时间:2018-06-05 11:06:42

相关推荐

Opencv3.0 手写数字识别(Hog特征+SVM分类器)

配置:VS+Opencv3.0

参考:

/iamzhangzhuping/article/details/51254567

/wang382758656/article/details/52723674

理论什么的就不多说了,网上很多。

直接上干货

1、前期准备

首先,下载好所需的训练文件和测试文件,然后将文件的图片名存入img.txt文件中备用,得到txt文件如下:(具体过程参考:批处理将文件名存入.txt文件中)

2、分类器训练

分类器训练主要包括两步:1)hog特征的提取;2)训练svm分类器,得到xml文件

代码如下:

#include <iostream>#include <fstream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/objdetect/objdetect.hpp>#include <opencv2/ml/ml.hpp>using namespace std;using namespace cv;using namespace cv::ml;int main(){//winsize(64,128),blocksize(16,16),blockstep(8,8),cellsize(8,8),bins9//检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9HOGDescriptor hog(Size(128, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);//HOG检测器,用来计算HOG描述子的int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人Ptr<SVM> svm = SVM::create();//SVM分类器string ImgName;//图片名(绝对路径)ifstream finPos("Image/img.txt");//正样本图片的文件名列表if (!finPos){cout << "Pos/Neg imglist reading failed..." << endl;return 1;}for (int num = 0; num < 200 && getline(finPos, ImgName); num++){std::cout << "Now processing original positive image: " << ImgName << endl;ImgName = "Image/" + ImgName;//加上正样本的路径名Mat src = imread(ImgName);//读取图片//if (CENTRAL_CROP)//src = src(Rect(16, 16, 128, 128));//将96*160的INRIA正样本图片剪裁为64*128,即剪去上下左右各16个像素vector<float> descriptors;//HOG描述子向量pute(src, descriptors, Size(8, 8));//计算HOG描述子,检测窗口移动步长(8,8)//处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量矩阵if (0 == num){DescriptorDim = descriptors.size();//初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMatsampleFeatureMat = Mat::zeros(200, DescriptorDim, CV_32FC1);//初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人sampleLabelMat = Mat::zeros(200, 1, CV_32SC1);//sampleLabelMat的数据类型必须为有符号整数型}//将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMatfor (int i = 0; i<DescriptorDim; i++)sampleFeatureMat.at<float>(num, i) = descriptors[i];//第num个样本的特征向量中的第i个元素sampleLabelMat.at<int>(num, 0) = num / 20;//正样本类别为1,有人}finPos.close();//输出样本的HOG特征向量矩阵到文件svm->setType(SVM::C_SVC);svm->setC(0.01);svm->setKernel(SVM::LINEAR);svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 3000, 1e-6));std::cout << "Starting training..." << endl;svm->train(sampleFeatureMat, ROW_SAMPLE, sampleLabelMat);//训练分类器std::cout << "Finishing training..." << endl;//将训练好的SVM模型保存为xml文件svm->SVM::save("SVM_HOG.xml");//imshow("src", src);waitKey();return 0;}

上述文件路径根据需要自行修改,运行编译即可得到xml文件,文件打开大致如下:

<?xml version="1.0"?>

-<opencv_storage>

-<opencv_ml_svm>

<format>3</format>

<svmType>C_SVC</svmType>

-<kernel>

<type>LINEAR</type>

</kernel>

<C>1.0000000000000000e-002</C>

-<term_criteria>

<iterations>3000</iterations>

</term_criteria>

<var_count>8100</var_count>

<class_count>10</class_count>

-<class_labels type_id="opencv-matrix">

<rows>10</rows>

<cols>1</cols>

<dt>i</dt>

<data> 0 1 2 3 4 5 6 7 8 9</data>

</class_labels>

<sv_total>45</sv_total>

+<support_vectors>

+<decision_functions>

</opencv_ml_svm>

</opencv_storage>

3、分类器测试

得到训练文件xml后即可进行识别,此处只用单张图片进行了测试,效果不错

具体代码如下:

#include <iostream>#include <fstream>#include <opencv2/core/bufferpool.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/objdetect/objdetect.hpp>#include <opencv2/ml/ml.hpp>using namespace std;using namespace cv;using namespace cv::ml;int main(){//creat SVM classfierPtr<SVM> svm = SVM::create();//load train filesvm = SVM::load<SVM>("SVM_HOG.xml");if (!svm){cout << "Load file failed..." << endl;}Mat test;test = imread("4.png");//if (!test)//{//cout << "not exist" << endl;//return -1;//}cout << "Load test image done..." << endl;//winsize(64,128),blocksize(16,16),blockstep(8,8),cellsize(8,8),bins9//检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9HOGDescriptor hog(Size(128, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);vector<float> descriptors;//HOG描述子向量pute(test, descriptors, Size(8, 8));//计算HOG描述子,检测窗口移动步长(8,8)int r = svm->predict(descriptors); //对所有行进行预测cout << "The number is " << r << endl;//waitKey();//note:The function only works if there is at least one HighGUI window created and the window is active.If there are several HighGUI windows, any of them can be active.//getchar();system("pause");return 1;}

此步注意把相应的xml文件及测试图片拷到项目文件中

运行效果如下:

源代码及资源文件下载:

/download/almost_miao/10216285

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。