在学习KNN(二)KNN算法手写数字识别的OpenCV实现我们直接将像素值作为特征,实现了KNN算法的手写数字识别问题,并得到了较好的准确率,但是就像其他机器学习算法一样,KNN的对象同样是特征,所以我们可以用一种特征提取算法配合KNN实现手写数字识别的任务。
下面用HOG原理及OpenCV实现中介绍的HOG算法提取特征,作为KNN的的输入,最后与像素值特征的结果进行对比。
在数据方面还是使用之前生成的5000张手写数字图片,并根据之前介绍的KNN与HOG的OpenCV实现,写出如下代码:
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv; char ad[128]={0}; int main() { Mat samFeatureMat ,samLabelMat; int k=5,testnum=0,truenum=0; HOGDescriptor hog(Size(20,20),Size(10,10),Size(2,2),Size(2,2),9);//利用构造函数,给对象赋值。 int DescriptorDim;//HOG描述子的维数 //读取训练数据 4000张 for (int i = 0; i < 10; i++) { for (int j =0;j<400;j++) { sprintf_s(ad, "D:\\data\\%d\\%d.jpg",i,j); Mat srcimage = imread(ad); vector<float> descriptors;//HOG描述子向量 hog.compute(srcimage,descriptors); if ( i == 0&&j==0) { DescriptorDim = descriptors.size(); samFeatureMat = Mat::zeros(4000 , DescriptorDim, CV_32FC1); samLabelMat = Mat::zeros(4000 , 1, CV_32FC1); } for(int k=0; k<DescriptorDim; k++) { samFeatureMat.at<float>(i*400+j,k) = descriptors[k]; samLabelMat.at<float>(i*400+j,0) = i; } } } samFeatureMat.convertTo(samFeatureMat,CV_32F); CvKNearest knn( samFeatureMat, samLabelMat, cv::Mat(), false, k ); cv::Mat nearests( 1, k, CV_32F); //读取测试数据 1000张 for (int i = 0; i < 10; i++) { for (int j =400;j<500;j++) { testnum++; sprintf_s(ad, "D:\\data\\%d\\%d.jpg",i,j); Mat testFeatureMat =Mat::zeros(1,DescriptorDim, CV_32FC1); Mat testdata = imread(ad); vector<float> descriptors;//HOG描述子向量 hog.compute(testdata,descriptors); for(int k=0; k<DescriptorDim; k++) { testFeatureMat.at<float>(0,k) = descriptors[k]; } testFeatureMat.convertTo(testFeatureMat,CV_32F); int response = knn.find_nearest(testFeatureMat,k,0,0,&nearests,0); if (response==i) { truenum++; } } } cout<<"测试总数"<<testnum<<endl; cout<<"正确分类数"<<truenum<<endl; cout<<"准确率:"<<(float)truenum/testnum*100<<"%"<<endl; return 0; }
在HOG特征提取时,我们将整张图片作为一个检测窗,并设置块尺寸为10*10,块步长为(2,2),cell尺寸为2*2,bin个数为9,那么计算一下描述子维数就是:
一个检测窗口中可以滑出36个块,一个块中可以划分25个cell,一个cell中产生9个方向,那么36*25*9=8100。
最后,结果统计如下所示:
————————————————
版权声明:本文为CSDN博主「chaibubble」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chaipp0607/article/details/78084415

