- 工具
采取QT5.6.1+opencv2.4.9
本文以实现将手写数字图片转化为csv文件列子
- 实现思路:
-1.将手写数字以分类在不同文件夹中(0-9)如下图所示:
-2.将所有图片的路径加载到txt文件中dir /b/s *.png > image.txt;生成的txt文件如下图:
-3.创立QFile csvFile(FILE_PATH),FILE_PATH为最终生产的csv文件的路径位置;
打开:csvFile.open(QIODevice::ReadWrite)
这里需要用ifstream进行文件流读取
ifstream getNamelist(picTXTtoute);//picTXTtoute:为image.txt的位置(string)
while(getline(getNamelist,ImgName));//读入txt的一行到ImgName,从而获取了第一幅图片的路径,反复读取,则实现了对图片的批量处理。
- 1
- 2
- 3
-4我们以每类图片所在文件夹的名字作为其标签(label),为了使生产的csv文件为(标签+像素值 像素值 像素值….)的结构我们现在需要获取每个ImgName的第56位字符,即(0-9),我们可以用以下句法实现
QString Dirroute =QString::fromStdString(ImgName);//为了得到标签(所以对与文件夹和图片的命名要有规律)
QString Midroute = Dirroute.mid(56,1);//标签位置
Midroute.append(",");//为转换为csv文件加“,”只要不是图片的最后一个像素那都是(像素值,)结构,最后一个像素那就是(像素值\n)结构;
- 1
- 2
- 3
注意在将(像素值,)(像素值\n)写入csvFile中的时候,我们需要Midroute转换为哦ascii码,在QT中用下面的语句实现
csvFile.write(Midroute.toLatin1());//这个是QFile::write()类型必须的,QString转换为ascii的句法。
- 1
至此我们已经将第一幅图片的标签写入了csv文件中,如下图绿色框选的位置
-5我们在进行图片像素的写入之前,我们需要知道几个小知识点,第一:我们的图片是三通道的,即一个像素点需要用三个像素值表示,在我们得到图片的rows和cols的之后,我们要将其存储的1*N的矩阵中,这个N不是rows*cols 而是rows*cols*3;
第二:本文用at去访问像素点,所以我们要提前知道Mat的数据类型,这里我们的图片Mat类型是uchar,uchar c = image.at(i,j);第二:用at访问的时候,image.at(i,j)实际访问的是(j,i)像素点的值;第三:为了在读取后的像素值后面加上“,”或者“\n”我们需要用到下面的知识点:
QString i = "iTest"; // current file's number
QString total = "totalTest"; // number of files to process
QString fileName = "fileNameTest"; // current file's name
QString status = QString("Processing file %1 of %2: %3")
.arg(i).arg(total).arg(fileName);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
记住最后QString要抓还为ascii才能写入csv;
-6最后,要用csvFile.close();结束csv文件操作
下面上代码:
.cpp
void ImagePreprocessing::writeImageToCSV(string picTXTtoute)
{
QString str;
QFile csvFile(FILE_PATH);//创建QFile对象 csvFile,File_PATH为csvFile文件保存的路径及类型
Mat inputImage;//接受从txt文件读入路径的图片
string ImgName; //接受从txt文件中读入图片的路径
int rows,cols;
ifstream getNamelist(picTXTtoute);//读取保存了图片路径和格式的txt文档
if(csvFile.open(QIODevice::ReadWrite))//打开文件,进行操作
{
while(getline(getNamelist,ImgName))//读入一行,\n为结束符
{
QString Dirroute =QString::fromStdString(ImgName);//为了得到标签(所以对与文件夹和图片的命名要有规律)
QString Midroute = Dirroute.mid(56,1);//标签位置
Midroute.append(",");//为转换为csv文件加“,”
csvFile.write(Midroute.toLatin1());//这个是QFile::write()类型必须的,QString转换为ascii的句法。写在没个图片的前面,作为标签号
// qDebug() << Midroute;
// cout<< ImgName <<endl; //路径输出
inputImage = imread(ImgName);
if(!inputImage.data)//异常退出
return;
rows = inputImage.rows;
cols = inputImage.cols;
int flagNum = rows * cols * 3;
int countNum = 0;
// cout << flagNum << endl;
for(int i = 0; i <rows; i++)//把衣服图片转换为N*1的矩阵。
{
for(int j = 0; j< cols * 3; j++)
{
countNum++;
uchar c = inputImage.at<uchar>(i,j);//用at操作,事前就要知道Mat中数据存储类型,uchar,flaot,或者其他。
if(countNum == flagNum)
{
str = QString("%1\n").arg(c);//最后一个像素,在后面添加\n作为行结束符号
// qDebug() << str;
}
else
str = QString("%1,").arg(c);//非最后一个像素值,则用逗号,隔开数据。
csvFile.write(str.toLatin1());//csvFile。write()遇到\n则会换行进行写,遇到的是“,”则继续在逗号后面写入数据
// qDebug() << str;
}
}
}
}
csvFile.close();//写完以后记住要关闭csv文件,正常结束
return;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33789319/article/details/78965196