在图像处理时,训练样本会读取比较多的图片,比如进行手写数字样本训练,提取样本特征时,若0到9各有100个样本,会需要读取1000张图片。
比较好用 的技巧是将各个图片的名字以数字来命名,例如0数字的样本文件名为000.bmp,001.bmp,002.bmp,...,099.bmp 这样可以通过循环比较方便的读取图片。
例如在文件夹ocrnumber中有1000个数字样本,读取他们并取反色,将文件名改成0_00.bmp,0_01.bmp,0_02.bmp,...,0_99.bmp
源代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main( )
{
double duration;
duration = static_cast<double>(getTickCount());
char file_in_path[255];
sprintf(file_in_path,"ocrnumber/");
char file_out_path[255];
sprintf(file_out_path,"ocr_bmp/");
char filein[255];
char fileout[255];
Mat image;
for (int i=0;i<10;i++)
{
for (int j=0;j<100;j++)
{
if (j<10)
{
sprintf(filein,"%s%d/%d0%d.pbm",file_in_path,i,i,j);//补0
//sprintf(fileout,"%s%d/%d_0%d.bmp",file_out_path,i,i,j);//补_0
sprintf(fileout,"%s%d/%d0%d.bmp",file_out_path,i,i,j);//补0
}
else
{
sprintf(filein,"%s%d/%d%d.pbm",file_in_path,i,i,j);
//sprintf(fileout,"%s%d/%d_%d.bmp",file_out_path,i,i,j);
sprintf(fileout,"%s%d/%d%d.bmp",file_out_path,i,i,j);
}
image=imread(filein,0);
if (!image.data)
{
printf("error\n");
break;
}
image=~image;
imwrite(fileout,image);
}
}
duration = static_cast<double>(getTickCount())-duration;
duration/=getTickFrequency();
cout<<duration<<"S"<<endl;
waitKey(27);
return 0;
}