ImageNet和PASCAL VOC图像描述的xml文件的解析、修改和生成
来源:互联网 发布:js文本框获得焦点 编辑:程序博客网 时间:2024/05/16 14:40
一、按照我的上篇博客(点击打开链接)配置好环境;
二、根据PASCAL VOC的xml文件的格式构建基类“Annotation”。
1、PASCAL VOC的xml文件的格式如下:
<annotation><folder>VOC2007</folder><filename>000001.jpg</filename><source><database>The VOC2007 Database</database><annotation>PASCAL VOC2007</annotation><image>flickr</image><flickrid>341012865</flickrid></source><owner><flickrid>Fried Camels</flickrid><name>Jinky the Fruit Bat</name></owner><size><width>353</width><height>500</height><depth>3</depth></size><segmented>0</segmented><object><name>dog</name><pose>Left</pose><truncated>1</truncated><difficult>0</difficult><bndbox><xmin>48</xmin><ymin>240</ymin><xmax>195</xmax><ymax>371</ymax></bndbox></object><object><name>person</name><pose>Left</pose><truncated>1</truncated><difficult>0</difficult><bndbox><xmin>8</xmin><ymin>12</ymin><xmax>352</xmax><ymax>498</ymax></bndbox></object></annotation>
2、构建的Annotation类如下:
#include <stdio.h>#include <string>#include <iostream>#include <vector>using namespace std;typedef struct _Source {string database;string annotation;string image;string flickrid;} Source, *PSource;typedef struct _Owner {string flickrid;string name;} Owner, *POwner;typedef struct _Size {int width;int height;int depth;} Size, *PSize;typedef struct _RECT {int xmin;int ymin;int xmax;int ymax;} RECT, *PRECT;typedef struct _Object {string name;string pose;string truncated;string difficult;RECT bndbox;} Object, *PObject;class Annotation{public:string folder;string filename;Source source;Owner owner;Size size;string segmented;vector<Object> objectList;Object object;Annotation();virtual ~Annotation();};
三、xml文件读取:
void XMLRead(const char* xmlPath, Annotation & annotation){xmlDocPtr doc;xmlNodePtr curNode;xmlChar *szKey;string filename = "";doc = xmlReadFile(xmlPath, "UTF-8", XML_PARSE_RECOVER); //解析文件"GB2312"if (doc == NULL){fprintf(stderr, "Document not parsed successfully.\n");}curNode = xmlDocGetRootElement(doc); //确定文档根元素if (NULL == curNode){fprintf(stderr, "empty document\n");xmlFreeDoc(doc);}if (xmlStrcmp(curNode->name, BAD_CAST "annotation")) {fprintf(stderr, "document of the wrong type, root node != Message");xmlFreeDoc(doc);}curNode = curNode->xmlChildrenNode;xmlNodePtr propNodePtr = curNode;xmlNodePtr sourceNodePtr = NULL;xmlNodePtr ownerNodePtr = NULL;xmlNodePtr sizeNodePtr = NULL;xmlNodePtr objectNodePtr = NULL;vector<xmlNodePtr> objectListP;xmlNodePtr objectNodePtr2 = NULL;xmlNodePtr bndboxNodePtr = NULL;// annotationwhile (curNode != NULL){//取出文件名称if (!xmlStrcmp(curNode->name, BAD_CAST "folder")) {annotation.folder = (char*)xmlNodeGetContent(curNode);}if (!xmlStrcmp(curNode->name, BAD_CAST "filename")) {annotation.filename = (char*)xmlNodeGetContent(curNode);}if (!xmlStrcmp(curNode->name, BAD_CAST "source")) {sourceNodePtr = curNode->xmlChildrenNode;}if (!xmlStrcmp(curNode->name, BAD_CAST "owner")) {ownerNodePtr = curNode->xmlChildrenNode;}if (!xmlStrcmp(curNode->name, BAD_CAST "size")) {sizeNodePtr = curNode->xmlChildrenNode;}if (!xmlStrcmp(curNode->name, BAD_CAST "segmented")) {annotation.segmented = (char*)xmlNodeGetContent(curNode);}if (!xmlStrcmp(curNode->name, BAD_CAST "object")) {objectNodePtr = curNode->xmlChildrenNode;objectListP.push_back(objectNodePtr);}curNode = curNode->next;}// sourcewhile (sourceNodePtr != NULL){if (!xmlStrcmp(sourceNodePtr->name, BAD_CAST "database")) {annotation.source.database = (char*)xmlNodeGetContent(sourceNodePtr);}if (!xmlStrcmp(sourceNodePtr->name, BAD_CAST "annotation")) {annotation.source.annotation = (char*)xmlNodeGetContent(sourceNodePtr);}if (!xmlStrcmp(sourceNodePtr->name, BAD_CAST "image")) {annotation.source.image = (char*)xmlNodeGetContent(sourceNodePtr);}if (!xmlStrcmp(sourceNodePtr->name, BAD_CAST "flickrid")) {annotation.source.flickrid = (char*)xmlNodeGetContent(sourceNodePtr);}sourceNodePtr = sourceNodePtr->next;}// ownerwhile (ownerNodePtr != NULL){if (!xmlStrcmp(ownerNodePtr->name, BAD_CAST "flickrid")) {annotation.owner.flickrid = (char*)xmlNodeGetContent(ownerNodePtr);}if (!xmlStrcmp(ownerNodePtr->name, BAD_CAST "name")) {annotation.owner.name = (char*)xmlNodeGetContent(ownerNodePtr);}ownerNodePtr = ownerNodePtr->next;}// sizewhile (sizeNodePtr != NULL){if (!xmlStrcmp(sizeNodePtr->name, BAD_CAST "width")) {annotation.size.width = atoi((char*)xmlNodeGetContent(sizeNodePtr));}if (!xmlStrcmp(sizeNodePtr->name, BAD_CAST "height")) {annotation.size.height = atoi((char*)xmlNodeGetContent(sizeNodePtr));}if (!xmlStrcmp(sizeNodePtr->name, BAD_CAST "depth")) {annotation.size.depth = atoi((char*)xmlNodeGetContent(sizeNodePtr));}sizeNodePtr = sizeNodePtr->next;}// objectfor (int i = 0; i < objectListP.size(); i++){objectNodePtr = objectListP[i];while (objectNodePtr != NULL){if (!xmlStrcmp(objectNodePtr->name, BAD_CAST "name")) {annotation.object.name = (char*)xmlNodeGetContent(objectNodePtr);}if (!xmlStrcmp(objectNodePtr->name, BAD_CAST "pose")) {annotation.object.pose = (char*)xmlNodeGetContent(objectNodePtr);}if (!xmlStrcmp(objectNodePtr->name, BAD_CAST "truncated")) {annotation.object.truncated = (char*)xmlNodeGetContent(objectNodePtr);}if (!xmlStrcmp(objectNodePtr->name, BAD_CAST "difficult")) {annotation.object.difficult = (char*)xmlNodeGetContent(objectNodePtr);}if (!xmlStrcmp(objectNodePtr->name, BAD_CAST "bndbox")) {bndboxNodePtr = objectNodePtr->xmlChildrenNode;}objectNodePtr = objectNodePtr->next;}// bndboxwhile (bndboxNodePtr != NULL){if (!xmlStrcmp(bndboxNodePtr->name, BAD_CAST "xmin")) {annotation.object.bndbox.xmin = atoi((char*)xmlNodeGetContent(bndboxNodePtr));}if (!xmlStrcmp(bndboxNodePtr->name, BAD_CAST "ymin")) {annotation.object.bndbox.ymin = atoi((char*)xmlNodeGetContent(bndboxNodePtr));}if (!xmlStrcmp(bndboxNodePtr->name, BAD_CAST "xmax")) {annotation.object.bndbox.xmax = atoi((char*)xmlNodeGetContent(bndboxNodePtr));}if (!xmlStrcmp(bndboxNodePtr->name, BAD_CAST "ymax")) {annotation.object.bndbox.ymax = atoi((char*)xmlNodeGetContent(bndboxNodePtr));}bndboxNodePtr = bndboxNodePtr->next;}annotation.objectList.push_back(annotation.object);}xmlFreeDoc(doc);}
四、XML文件生成和保存
void XMLWrite(const char* xmlPath, Annotation & annotation){xmlDocPtr doc = NULL;xmlNodePtr root_node = NULL, node = NULL, objectNode = NULL, node1 = NULL;//Creates a new document, a node and set it as a root nodedoc = xmlNewDoc(BAD_CAST "1.0");root_node = xmlNewNode(NULL, BAD_CAST "annotation");//xmlNewProp(root_node, BAD_CAST "version", BAD_CAST "1.0");xmlDocSetRootElement(doc, root_node);//creates a new node, which is "attached" as child node of root_node node.xmlNewChild(root_node, NULL, BAD_CAST "folder", BAD_CAST annotation.folder.c_str());xmlNewChild(root_node, NULL, BAD_CAST "filename", BAD_CAST annotation.filename.c_str());node = xmlNewChild(root_node, NULL, BAD_CAST "source", NULL);xmlNewChild(node, NULL, BAD_CAST "database", BAD_CAST annotation.source.database.c_str());xmlNewChild(node, NULL, BAD_CAST "annotation", BAD_CAST annotation.source.annotation.c_str());xmlNewChild(node, NULL, BAD_CAST "image", BAD_CAST annotation.source.image.c_str());xmlNewChild(node, NULL, BAD_CAST "flickrid", BAD_CAST annotation.source.flickrid.c_str());node = xmlNewChild(root_node, NULL, BAD_CAST "owner", NULL);xmlNewChild(node, NULL, BAD_CAST "flickrid", BAD_CAST annotation.owner.flickrid.c_str());xmlNewChild(node, NULL, BAD_CAST "name", BAD_CAST annotation.owner.name.c_str());node = xmlNewChild(root_node, NULL, BAD_CAST "size", NULL);char temp[32];_itoa(annotation.size.width, temp, 10);xmlNewChild(node, NULL, BAD_CAST "width", BAD_CAST _itoa(annotation.size.width, temp, 10));xmlNewChild(node, NULL, BAD_CAST "height", BAD_CAST _itoa(annotation.size.height, temp, 10));xmlNewChild(node, NULL, BAD_CAST "depth", BAD_CAST _itoa(annotation.size.depth, temp, 10));xmlNewChild(root_node, NULL, BAD_CAST "segmented", BAD_CAST annotation.segmented.c_str());for (int i = 0; i < annotation.objectList.size(); i++){objectNode = xmlNewChild(root_node, NULL, BAD_CAST "object", NULL);xmlNewChild(objectNode, NULL, BAD_CAST "name", BAD_CAST annotation.objectList[i].name.c_str());xmlNewChild(objectNode, NULL, BAD_CAST "pose", BAD_CAST annotation.objectList[i].pose.c_str());xmlNewChild(objectNode, NULL, BAD_CAST "truncated", BAD_CAST annotation.objectList[i].truncated.c_str());xmlNewChild(objectNode, NULL, BAD_CAST "difficult", BAD_CAST annotation.objectList[i].difficult.c_str());node = xmlNewChild(objectNode, NULL, BAD_CAST "bndbox", NULL);xmlNewChild(node, NULL, BAD_CAST "xmin", BAD_CAST _itoa(annotation.objectList[i].bndbox.xmin, temp, 10));xmlNewChild(node, NULL, BAD_CAST "ymin", BAD_CAST _itoa(annotation.objectList[i].bndbox.ymin, temp, 10));xmlNewChild(node, NULL, BAD_CAST "xmax", BAD_CAST _itoa(annotation.objectList[i].bndbox.xmax, temp, 10));xmlNewChild(node, NULL, BAD_CAST "ymax", BAD_CAST _itoa(annotation.objectList[i].bndbox.ymax, temp, 10));}//// xmlNewProp() creates attributes, which is "attached" to an node.//node = xmlNewChild(root_node, NULL, BAD_CAST "node3", BAD_CAST"node has attributes");//xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");////Here goes another way to create nodes.//node = xmlNewNode(NULL, BAD_CAST "node4");//node1 = xmlNewText(BAD_CAST"other way to create content");//xmlAddChild(node, node1);//xmlAddChild(root_node, node);xmlSaveFormatFileEnc(xmlPath, doc, "UTF-8", 1);//Dumping document to stdio or filexmlFreeDoc(doc);xmlCleanupParser();xmlMemoryDump();//debug memory for regression tests}
五、对PASCAL VOC图像描述的xml文件进行解析,然后重新生成。
int main(){const char* xmlPath = "C:\\Users\\zyy\\Desktop\\XML_test\\PASCAL\\000001.xml";//const char* xmlPath = "C:\\Users\\zyy\\Desktop\\XML_test\\ImageNet\\n01440764_18.xml";Annotation annotation;XMLRead(xmlPath, annotation);XMLWrite("./temp.xml", annotation);//system("pause");return 0;}
结果如下:
<?xml version="1.0" encoding="UTF-8"?><annotation> <folder>VOC2007</folder> <filename>000001.jpg</filename> <source> <database>The VOC2007 Database</database> <annotation>PASCAL VOC2007</annotation> <image>flickr</image> <flickrid>341012865</flickrid> </source> <owner> <flickrid>Fried Camels</flickrid> <name>Jinky the Fruit Bat</name> </owner> <size> <width>353</width> <height>500</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>dog</name> <pose>Left</pose> <truncated>1</truncated> <difficult>0</difficult> <bndbox> <xmin>48</xmin> <ymin>240</ymin> <xmax>195</xmax> <ymax>371</ymax> </bndbox> </object> <object> <name>person</name> <pose>Left</pose> <truncated>1</truncated> <difficult>0</difficult> <bndbox> <xmin>8</xmin> <ymin>12</ymin> <xmax>352</xmax> <ymax>498</ymax> </bndbox> </object></annotation>
1 0
- ImageNet和PASCAL VOC图像描述的xml文件的解析、修改和生成
- Python生成PASCAL VOC格式的xml标注文件
- Python生成PASCAL VOC格式的xml标注文件
- Python生成PASCAL VOC格式的xml标注文件
- XML文件的解析和生成(DOM)
- XML文件的生成和解析
- xml文件的生成和解析
- 图像分割的papers、github地址及pascal voc排名
- XML的解析和生成
- xml的生成和解析
- xml的生成和解析
- XML的生成和解析
- XML文件和JSON文件的解析及生成
- Cocos2d-x tinyxml2用于xml的解析,自动生成xml文件和解析xml文件
- springmvc.xml文件头的描述和请求路径前缀和后缀的解析
- 用dom4j的方式解析和生成xml文件
- 关于Android下,XML文件的生成和解析方式
- java解析和生成xml文件的补充
- fir.im Weekly - 深度揭秘 App 启动全过程
- windows上 QtCreator调用OpenCv
- MySQL快速复制数据表数据方案
- 反射调用性能比较
- 深入浅出Windows 10 通用应用开发学习笔记(C++) 3-1
- ImageNet和PASCAL VOC图像描述的xml文件的解析、修改和生成
- Android 6.0: 动态权限管理的解决方案
- casperjs 各控件实现方法
- 对称多处理结构
- BroadcastRecevier广播的基本使用
- oracle创建函数例子
- 关于LED电视机视频编码H.264,MPEG4,MPEG2能支持哪些格式的视频文件
- include包含文件查找的顺序
- 网络资源:常用的图表类库插件