資源簡介
在OpenCV3.4.1上使用hog+svm實現了數字識別,提供了檢測與訓練部分,訓練已經訓練,可以直接運行。

代碼片段和文件信息
#include?
#include?
#include?
#include?“opencv2/objdetect.hpp“
#include?
using?namespace?cv::ml;
using?namespace?cv;
using?namespace?std;
string?pathName?=?“digits.png“;
int?SZ?=?20;
float?affineFlags?=?WARP_INVERSE_MAP?|?INTER_LINEAR;
//傾斜矯正
Mat?deskew(Mat&?img)?{
Moments?m?=?moments(img);
if?(abs(m.mu02)?1e-2)?{
return?img.clone();
}
float?skew?=?m.mu11?/?m.mu02;
Mat?warpMat?=?(Mat_(2?3)?<1?skew?-0.5*SZ*skew?0?1?0);?//2*3變換矩陣
Mat?imgOut?=?Mat::zeros(img.rows?img.cols?img.type());
warpAffine(img?imgOut?warpMat?imgOut.size()?affineFlags);
return?imgOut;
}
//加載訓練測試數據集標簽
void?loadTrainTestLabel(string?&pathName?vector?&trainCells??vector?&trainLabels)?{
Mat?img?=?imread(pathName?CV_LOAD_IMAGE_GRAYSCALE);
int?ImgCount?=?0;
for?(int?i?=?0;?i? {
for?(int?j?=?0;?j? {
Mat?digitImg?=?(img.colRange(j?j?+?SZ).rowRange(i?i?+?SZ)).clone();
trainCells.push_back(digitImg);
ImgCount++;
}
}
cout?<“Image?Count?:?“?<
float?digitClassNumber?=?0;
for?(int?z?=?0;?z {
if?(z?%?500?==?0?&&?z?!=?0)
{
digitClassNumber?=?digitClassNumber?+?1;
}
trainLabels.push_back(digitClassNumber);
}
}
//?創建傾斜矯正后的訓練集測試集
void?CreateDeskewedTrainTest(vector?&deskewedTrainCells?vector?&trainCells)?{
for?(int?i?=?0;?i
Mat?deskewedImg?=?deskew(trainCells[i]);
deskewedTrainCells.push_back(deskewedImg);
}
}
//HOG特征描述子
HOGDescriptor?hog(
Size(20?20)?//winSize
Size(10?10)?//blocksize
Size(5?5)?//blockStride
Size(10?10)?//cellSize
9?//nbins
1?//derivAper
-1?//winSigma
0?//histogramNormType
0.2?//L2HysThresh
0//gammal?correction
64//nlevels=64
1);
//創建訓練測試HOG特征,并將計算結果保存至
void?CreateTrainTestHOG(vector?>?&trainHOG?vector?&deskewedtrainCells)?{
//train?hog大小為num*hogsize
for?(int?y?=?0;?y vector?descriptors;
hog.compute(deskewedtrainCells[y]?descriptors?Size(2?2)?Size(0?0));
trainHOG.push_back(descriptors);
}
}
void?ConvertVectortoMatrix(vector?>?&trainHOG??Mat?&trainMat)
{
int?descriptor_size?=?trainHOG[0].size();//第一個樣本的特征大小
for?(int?i?=?0;?i for?(int?j?=?0;?jriptor_size;?j++)?{
trainMat.at(i?j)?=?trainHOG[i][j];
}
}
}
void?getSVMParams(SVM?*svm)
{
cout?<“Kernel?type?????:?“?<getKernelType()?< cout?<“Type????????????:?“?<getType()?< cout?<“C???????????????:?“?<getC()?< cout?<“Degree??????????:?“?<getDegree()?< cout?<“Nu??????????????:?“?<getNu()?< cout?<“Gamma???????????:?“?<getGamma()?<}
void?SVMtrain(M
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????721129??2017-01-30?07:04??digits.png
?????文件????????5031??2018-04-30?19:05??main.cpp
?????文件?????1783266??2018-04-30?17:10??model4.yml
評論
共有 條評論