该文目的是整理最近使用到的文件操作及字符串操作,作为资料留存。方法不一定是最优的,功能可用即可。
(一) 读取文件数据,数据由tab间隔,前2行是图像数据的行数和列数。并且第一列是样本图像数据的标签。
具体描述:
1、数据存储的训练数据,图像数据被转换为一个行向量,第一列是样本的标签。
2、提取的标签数据和图像数据分布存储在opencv的mat矩阵
3、由于进行了atoi转换,数据必须是8u图像,即灰度图像或二值图像。若不采用atoi,代码适用其他场景
// 加载训练数据 { ifstream in("Y:\\trainDataNew.mat.data"); if(!in.is_open()) { return ; } string line ; string str; // 先读取行列数 getline(in,line); int count = atoi(line.c_str()); getline(in,line); //读取一行数据 int cols = atoi(line.c_str()); trainDataLabel = Mat::zeros(Size(1,count),CV_8U); trainData = Mat::zeros(Size(cols -1,count),CV_8U); // 读取数据 int sampleCount =0; while(getline(in,line)) { int nSPos = 0; int nEPos = 0; int nIdx = cols; for (int i =0;i<nIdx;++i) { nEPos = line.find('\t',nSPos); //返回字符位置 if(nEPos != string::npos) // npos 表示查找失败 { str = line.substr(nSPos,nEPos - nSPos); //cout<< atoi(str.c_str())<<endl; if(i ==0) { trainDataLabel.at<uchar>(sampleCount,i) = atoi(str.c_str()); }else { trainData.at<uchar>(sampleCount,i) = atoi(str.c_str()); } nSPos = nEPos; nSPos++; // 后移一位,跳过字符'\t' } } sampleCount ++; } in.close(); if(m_debug) { addWeighted(trainData,255,NULL,NULL,NULL,trainData); imshow("trainData",trainData); waitKey(0); } }