提取文件夹中所有xml文件中的数据到txt(为人脸识别级联器使用的txt做准备)

【知识点】pugixml框架提取多个相同节点内容、遍历文件夹、保存到txt。

xml文件由labelImg.exe软件标定图像生成。此博客把xml文件内容提取到txt中,为人脸识别opencv_annotation.exe、opencv_createsamples.exe、opencv_traincascade.exe服务

 

所有xml放到一个文件夹中,代码功能:遍历此文件夹,提取xml内容,保存到txt

#include"pugixml\pugixml.hpp"
#include<iostream>
#include<fstream> //检索文件夹
#include<io.h> //存储到txt

using namespace pugi;
using namespace std;

int main()
{
    ofstream OpenFile("file.txt");

    //目标文件夹路径
    string inPath = "D:/XMLtoTXT/xmlDataTrain/*.xml";//遍历文件夹下的所有.xml文件
    //用于查找的句柄
    long long handle=0;//这个地方需要特别注意,win10用户必须用long long 类型,win7可以用long类型
    struct _finddata_t fileinfo; //存储检索到的文件信息
    //第一次查找
    handle = _findfirst(inPath.c_str(), &fileinfo);
    if (handle == -1)    return -1;
    do
    {        
        //printf("%s\n", fileinfo.name);//找到的文件的文件名
        xml_document doc;
        string path(fileinfo.name);//char[]类型转string,为了方便字符串连接
        string path = "./xmlDataTrain/"+ path;
        doc.load_file(path.c_str());//c_str(),string转char[]

        xml_node nodes = doc.child("annotation");
        OpenFile << nodes.child("path").text().get(); //输出到txt
        int i = 0; //框选的缺陷个数,即object标签个数
        for (xml_node node = nodes.first_child(); node; node = node.next_sibling())
        {
            string name = node.name();
            if (name == "object")
            {
                i++;
            }
        }
        OpenFile << " " << i; //输出到txt
        for (xml_node node = nodes.first_child(); node; node = node.next_sibling())
        {
            string name = node.name();
            if (name == "object")
            {
                int x = node.child("bndbox").child("xmin").text().as_int();
                int y = node.child("bndbox").child("ymin").text().as_int();
                int x2 = node.child("bndbox").child("xmax").text().as_int();
                int y2 = node.child("bndbox").child("ymax").text().as_int();
                int w = x2 - x;
                int h = y2 - y;
                OpenFile << " " << x << " " << y << " " << w << " " << h; //输出到txt
            }
        }
        OpenFile << endl;    

    } while (!_findnext(handle, &fileinfo));
    OpenFile.close(); //关闭txt
    _findclose(handle);

    return 0;    
}

 

posted @ 2020-02-24 18:11  夕西行  阅读(761)  评论(0编辑  收藏  举报