标签:KNN gray 20 Mat int 分类 OpenCV model side
1 #include<iostream> 2 #include <opencv2\opencv.hpp> 3 using namespace cv; 4 using namespace std; 5 #include "test.h" 6 7 int main() 8 { 9 Mat img = imread("1.png"); 10 Mat gray; 11 cvtColor(img, gray, CV_BGR2GRAY); 12 threshold(gray, gray, 0, 255, CV_THRESH_BINARY); 13 // digits.png为2000 * 1000,其中每个数字的大小为20 * 20, 14 // 总共有5000((2000*1000) / (20*20))个数字,类型为[0~9], 15 // [0~9]10个数字每个数字有5000/10 = 500个样本 16 // 对其分割成单个20 * 20的图像并序列化成(转化成一个一维的数组) 17 int side = 20; 18 int m = gray.rows / side; 19 int n = gray.cols / side; 20 Mat data, labels; 21 for (int i = 0; i < m; i++) { 22 23 int offsetRow = i * side; 24 for (int j = 0; j < n; j++) { 25 26 int offsetCol = j * side; 27 // 截取20*20的小块 28 29 30 Mat tmp; 31 32 gray(Range(offsetRow, offsetRow + side), Range(offsetCol, offsetCol + side)).copyTo(tmp); 33 34 data.push_back(tmp.reshape(0, 1)); // 序列化转换成一个一维向量 35 labels.push_back(i / 5); // 每500个为一个label类型 36 } 37 } 38 data.convertTo(data, CV_32F); 39 cout << "读取结束..." << endl; 40 //****************** 使用KNN算法训练********************// 41 int K = 7; // 改变K值可能会出现不同的效果,K值越大,识别速度越慢 42 Ptr<TrainData> tData = TrainData::create(data, ROW_SAMPLE, labels); 43 Ptr<KNearest> model = KNearest::create(); 44 model->setDefaultK(K); 45 model->setIsClassifier(true); 46 model->train(tData); 47 model->save("KnnTest.xml"); 48 ///********************测试模型***************************/// 49 Mat test = imread(".\\test\\3.jpg", 0);//截取图像中一个数字 50 Mat bw; 51 threshold(test, bw, 0, 255, CV_THRESH_BINARY); 52 Mat I0 = bw.reshape(0, 1); 53 I0.convertTo(I0, CV_32F); 54 // 开始用KNN预测分类,返回识别结果 55 float r = model->predict(I0); 56 57 }
标签:KNN,gray,20,Mat,int,分类,OpenCV,model,side 来源: https://www.cnblogs.com/hsy1941/p/11717703.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。