您的位置:首页 > 运维架构

opencv实现KNN手写数字的识别

2016-04-01 19:02 816 查看
  人工智能是当下很热门的话题,手写识别是一个典型的应用。为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务。

  预处理一张图片:

  首先采用opencv读取图片的构造函数读取灰度的图片,再采用大津法求出图片的二值化的阈值,并且将图片二值化。

void knnTrain() {
#ifdef SAVETRAINED
//knn training;
samples.clear();
dat_mat = Mat::zeros(10 * nImgNum, 324, CV_32FC1);
res_mat = Mat::zeros(10 * nImgNum, 1, CV_32FC1);
for (int i = 0; i != 10; i++) {
getFile(dirNames[i], i);
}
preTrain();
cout << "------ Training finished. -----" << endl << endl;
knn.train(dat_mat, res_mat, Mat(), false, 2);

#ifdef SAVEASXML
knn.save("./trained/knnTrained.xml");
#endif

#else
knn.load("./trained/knnTrained.xml");
#endif

//knn test
cout << endl << "--- KNN test mode : ---" << endl;
int tCnt = 10000;
int tAc = 0;
selfknnTest(tCnt, tAc);

cout << endl << endl << "Total number of test samples : " << tCnt << endl;

cout << "Accuracy : " << float(float(tAc) / float(tCnt)) * 100 << "%" << endl;
}


train
 训练结果如下,准确率还是很令人满意的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: