批量读取图片保存为csv文件

  • 工具

采取QT5.6.1+opencv2.4.9
本文以实现将手写数字图片转化为csv文件列子

  • 实现思路:
    -1.将手写数字以分类在不同文件夹中(0-9)如下图所示:批量读取图片保存为csv文件_第1张图片
    -2.将所有图片的路径加载到txt文件中dir /b/s *.png > image.txt;生成的txt文件如下图:批量读取图片保存为csv文件_第2张图片
    -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,从而获取了第一幅图片的路径,反复读取,则实现了对图片的批量处理。

-4我们以每类图片所在文件夹的名字作为其标签(label),为了使生产的csv文件为(标签+像素值 像素值 像素值….)的结构我们现在需要获取每个ImgName的第56位字符,即(0-9),我们可以用以下句法实现

  QString Dirroute =QString::fromStdString(ImgName);//为了得到标签(所以对与文件夹和图片的命名要有规律)
  QString Midroute = Dirroute.mid(56,1);//标签位置
  Midroute.append(",");//为转换为csv文件加“,”只要不是图片的最后一个像素那都是(像素值,)结构,最后一个像素那就是(像素值\n)结构;

注意在将(像素值,)(像素值\n)写入csvFile中的时候,我们需要Midroute转换为哦ascii码,在QT中用下面的语句实现

csvFile.write(Midroute.toLatin1());//这个是QFile::write()类型必须的,QString转换为ascii的句法。

至此我们已经将第一幅图片的标签写入了csv文件中,如下图绿色框选的位置
批量读取图片保存为csv文件_第3张图片
-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);  

记住最后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 <
            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 //把衣服图片转换为N*1的矩阵。
            {
                for(int j = 0; j< cols * 3; j++)
                {
                    countNum++;
                    uchar c = inputImage.at(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;
}

你可能感兴趣的:(QT,opencv)