博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++------------提取文件中的信息
阅读量:6507 次
发布时间:2019-06-24

本文共 7979 字,大约阅读时间需要 26 分钟。

对于文件比较复杂的时候,为了获取文件中的信息,需要一些比较特殊的函数,比如,getline()、replace()、atoi,atof等

例子一,读取以下文件中的数据,并保存进一个类里面。

首先,类的定义如下,感觉是struct,但是按照struct的处理,我这段代码出错了,不知道什么问题,暂时po出来吧,有空看看。

struct ImageLabel{    std::string imagePath;//save图片路径名    int faceBox[4];//输入点集的最外层包络矩形rect四个参数    int landmarkPos[2*LandmarkPointsNum];//输入点集private:    friend class cereal::access;    /**     * Serialises this class using cereal.     *     * @param[in] ar The archive to serialise to (or to serialise from).     */    template
void serialize(Archive& ar) { ar(imagePath, faceBox, landmarkPos); }};

 

然后读入一系列如下文件,每个文件的数据保存格式相同,因此定义了一个vector,来顺序存储每一个文件对应的类

文件如下:*.pts文件

version: 1n_points: 68{446.000 91.000449.459 119.344450.957 150.614460.552 176.986471.486 202.157488.087 226.842506.016 246.438524.662 263.865553.315 271.435578.732 266.260599.361 248.966615.947 220.651627.439 197.999635.375 179.064642.063 156.371647.302 124.753646.518 92.944470.271 117.870486.218 109.415503.097 114.454519.714 120.090533.680 127.609571.937 123.590585.702 117.155602.344 109.070620.077 103.951633.964 111.236554.931 145.072554.589 161.106554.658 177.570554.777 194.295532.717 197.930543.637 202.841555.652 205.483565.441 202.069576.368 197.061487.474 136.436499.184 132.337513.781 133.589527.594 143.047513.422 144.769499.117 144.737579.876 140.815590.901 130.008605.648 128.376618.343 132.671606.771 140.525593.466 141.419519.040 229.040536.292 221.978}

 

所有pts文件名都保存在一个TXT文件中,对应的图像名也保存在一个TXT文件中,我们需要把图片的文件路径加文件名保存到类里面,为了处理方便我们用了replace函数,直接替换pts文件名的的后三位,得到新的文件名。

 

void readpic(std::vector
&Imagelabels){ cout<<"test readpic"<
imagePath=filePath+line;//将文件全路径保存在 mImageLabel->imagePath mImageLabel.imagePath=filePath+line;//将文件全路径保存在 mImageLabel->imagePath cout<
<
vp2f; char line11[1024]={
0};//存放每行数据 //将文件逐行读取到string linestr中,然后对行的内容进行判断 while(LabelsFile.getline(line11, sizeof(line11))){ //从第四行开始把数据写进landmark数组中 if((index>=3)&&(index<139)){ string x = ""; string y = ""; std::stringstream word(line11); word >> x; word >> y; cout<
<<" "<
<

 

其中,因为GetLine读出来的数据是string类型,因此需要将数据转成int型,看到pts文件中数据是都是float型,因此先要将string转成float,用的是atof函数。

另外如果把 Imagelabels 当做类来处理只需要,最开始,ImageLabel mImageLabel;后面直接push_back,不需要delete。所有的引用都变成:mImageLabel.faceBox,不能用mImageLabel->landmarkPos。

 

另外一个升级的例子,处理起来很复杂,这里把ImageLabel当做一个struct来处理,这样需要new,也需要delete,引用的时候也是用的->,这个需要注意。

文件是:labels_ibug_300W.xml

稍微看一部分,了解下它的构成。

iBUG face point dataset - All images
This folder contains data downloaded from:http://ibug.doc.ic.ac.uk/resources/facial-point-annotations/The dataset is actually a combination of the AFW, HELEN, iBUG, and LFPWface landmark datasets. But the iBUG people have aggregated it all togetherand gave them a consistent set of 68 landmarks across all the images, therebyturning it into one big dataset.Note that we have adjusted the coordinates of the points from the MATLAB conventionof 1 being the first index to 0 being the first index. So the coordinates in thisfile are in the normal C 0-indexed coordinate system.We have also added left right flips (i.e. mirrors) of each image and alsoappropriately flipped the landmarks. This doubles the size of the dataset.Each of the mirrored versions of the images has a filename that ends with_mirror.jpg.Finally, note that the bounding boxes are from dlib's default face detector. For thefaces the detector failed to detect, we guessed at what the bounding box would have beenhad the detector found it and used that.

 

可以找到一些规律,按照这些规律来得到我们需要的数据,直接上代码:

void ReadLabelsFromFile(std::vector
&Imagelabels, std::string Path = "labels_ibug_300W.xml"){ std::string ParentPath(trainFilePath); std::ifstream LabelsFile(ParentPath+Path, std::ios::in); if(!LabelsFile.is_open()) return; std::string linestr; while(std::getline(LabelsFile, linestr)){ linestr = trim(linestr); linestr = replace(linestr, "
", ""); linestr = replace(linestr, "<", ""); linestr = replace(linestr, ">", ""); linestr = replace(linestr, "'", ""); std::vector
strNodes = split(linestr, " "); static ImageLabel* mImageLabel = NULL; switch (strNodes.size()) { case 1: if(strNodes[0] == "image"){ Imagelabels.push_back(*mImageLabel); delete mImageLabel; } break; case 2: if(strNodes[0] == "image"){ mImageLabel = new ImageLabel(); mImageLabel->imagePath = ParentPath + split(strNodes[1], "=")[1];// std::cout << mImageLabel->imagePath << std::endl;// cv::Mat Image = cv::imread(mImageLabel->imagePath);// cv::imshow("Image", Image);// cv::waitKey(0); } break; case 5: if(strNodes[0] == "box"){ mImageLabel->faceBox[0] = atoi(split(strNodes[1], "=")[1].data()); mImageLabel->faceBox[1] = atoi(split(strNodes[2], "=")[1].data()); mImageLabel->faceBox[2] = atoi(split(strNodes[3], "=")[1].data()); mImageLabel->faceBox[3] = atoi(split(strNodes[4], "=")[1].data()); } break; case 4: if(strNodes[0] == "part"){ int index = atoi(split(strNodes[1], "=")[1].data()); mImageLabel->landmarkPos[index] = atoi(split(strNodes[2], "=")[1].data()); mImageLabel->landmarkPos[index+LandmarkPointsNum] = atoi(split(strNodes[3], "=")[1].data()); } break; default: break; } } LabelsFile.close();}

 

 

 

 

 

 

转载地址:http://fvwfo.baihongyu.com/

你可能感兴趣的文章
乐视云基于Kubernetes的PaaS平台建设
查看>>
R 学习笔记《十》 R语言初学者指南--图形工具
查看>>
PHP通过读取DOM抓取信息
查看>>
DICOM医学图像处理:DICOM网络传输
查看>>
nio和传统Io的区别
查看>>
移动端网页布局中需要注意事项以及解决方法总结
查看>>
oracle
查看>>
我也要谈谈大型网站架构之系列(2)——纵观历史演变(下)
查看>>
大话设计模式(Golang) 二、策略模式
查看>>
使用PostgreSQL 9.6 架设mediawiki服务器
查看>>
数据库服务器硬件对性能的影响
查看>>
LVM
查看>>
php 几个比较实用的函数
查看>>
(译)OpenGL ES2.0 – Iphone开发指引
查看>>
@RestController 与 @RequestMapping
查看>>
黑马程序员.bobo.DAY.1
查看>>
Unity shader 官网文档全方位学习(二)
查看>>
pbrun
查看>>
浏览器加载和渲染网页顺序
查看>>
深入剖析Android系统试读样章
查看>>