C++读取labelimg的标注xml文件内容

news/2024/11/14 0:59:58/文章来源:https://www.cnblogs.com/Jack-Elvis/p/18540913

C++读取labelimg的标注xml文件内容

 该xml文件为labelImg.exe生成,通过C++获取到该文件中的标签名字与位置,然后保存到容器中供后续方便调用。

1、下载库tinyxml;https://sourceforge.net/projects/tinyxml/

 

2、将tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp这6个文件拷贝到工程下;

 

3、引入两个头文件,#include "tinystr.h",#include "tinyxml.h";

 1 #include <iostream>
 2 #include <opencv.hpp>
 3 #include <fstream>
 4 #include <vector>
 5 #include <map>
 6 #include <string>
 7 #include "tinystr.h"
 8 #include "tinyxml.h"
 9  
10 using namespace std;
11 using namespace cv;
12  
13 typedef vector<pair<std::string, cv::Rect>> vecNameLoc;
14 vecNameLoc m_boltCentRects, m_boltCheckRects;
15 vecNameLoc m_boardCheckRects, m_posTemplRects, m_angleTemplRects, m_maskTemplRects;
16 typedef map<std::string, cv::Rect> mapNameLoc;
17 mapNameLoc m_mapTemplRectsImg;
18 mapNameLoc m_mapTemplRectsMain;
19  
20 int readLabelFromXML(string path)
21 {
22     TiXmlDocument doc;//申明一个文档类型变量,用来存储读取的xml文档
23     if (!doc.LoadFile(path.c_str()))   //检测xml文档是否存在
24     {
25         cerr << doc.ErrorDesc() << endl;
26     }
27     TiXmlElement* annotation = doc.FirstChildElement();//指向xml文档的根元素
28     if (annotation == NULL)//检测根元素存在性     
29     {
30         cerr << "Failed to load file: No root element." << endl;
31         doc.Clear();
32         return -1;
33     }
34     TiXmlElement* object = annotation->FirstChildElement(); // xml的id 根节点下第一个子节点
35     object = object->NextSiblingElement("object");
36     while (object != NULL)
37     {
38         TiXmlElement* nameElement = object->FirstChildElement();
39         string name = nameElement->GetText();
40         TiXmlElement* bndbox = nameElement->NextSiblingElement("bndbox");
41         TiXmlElement* xmin = bndbox->FirstChildElement();
42         string xminValue = xmin->GetText();
43         TiXmlElement* ymin = xmin->NextSiblingElement();
44         string yminValue = ymin->GetText();
45         TiXmlElement* xmax = ymin->NextSiblingElement();
46         string xmaxValue = xmax->GetText();
47         TiXmlElement* ymax = xmax->NextSiblingElement();
48         string ymaxValue = ymax->GetText();
49         Rect rect(Point(stoi(xminValue), stoi(yminValue)), Point(stoi(xmaxValue), stoi(ymaxValue)));
50         m_mapTemplRectsImg[name] = rect;
51         m_mapTemplRectsMain[name] = rect;
52         if (name.find("pos") != string::npos && name.find("pos_net") == string::npos)
53         {
54             m_posTemplRects.push_back(std::pair<string, cv::Rect>(name, rect));
55         }
56         else if (name.find("angle") != string::npos || name.find("rot") != string::npos)
57         {
58             m_angleTemplRects.push_back(std::pair<string, cv::Rect>(name, rect));
59         }
60         else if (name.find("board") != string::npos || name.find("sim") != string::npos || name.find("plate") != string::npos)
61         {
62             m_boardCheckRects.push_back(std::pair<string, cv::Rect>(name, rect));
63         }
64         else if (name.find("bolt") != string::npos && name.find("checkbolt") == string::npos)
65         {
66             m_boltCentRects.push_back(std::pair<string, cv::Rect>(name, rect));
67         }
68         else if (name.find("checkbolt") != string::npos)
69         {
70             m_boltCheckRects.push_back(std::pair<string, cv::Rect>(name, rect));
71         }
72         else if (name.find("mask") != string::npos)
73         {
74             m_maskTemplRects.push_back(std::pair<string, cv::Rect>(name, rect));
75         }
76         else
77         {
78             if (name.find("power") != string::npos)
79             {
80                 continue;
81             }
82         }
83         object = object->NextSiblingElement("object");
84     }
85     //按名称排序
86     std::sort(m_boltCentRects.begin(), m_boltCentRects.end(), [](auto v1, auto v2) {return v1.first < v2.first; });
87     std::sort(m_boltCheckRects.begin(), m_boltCheckRects.end(), [](auto v1, auto v2) {return v1.first < v2.first; });
88     return 0;
89 }
90  
91 int main()
92 {
93     readLabelFromXML("test.xml");
94     return 0;
95 }
96  
97  

  1 <annotation>
  2     <folder>XXX</folder>
  3     <filename>XXX.png</filename>
  4     <path>D:/XXX.png</path>
  5     <source>
  6         <database>Unknown</database>
  7     </source>
  8     <size>
  9         <width>2309</width>
 10         <height>4647</height>
 11         <depth>1</depth>
 12     </size>
 13     <segmented>0</segmented>
 14     <object>
 15         <name>pos_rear_cam</name>
 16         <pose>Unspecified</pose>
 17         <truncated>0</truncated>
 18         <difficult>0</difficult>
 19         <bndbox>
 20             <xmin>190</xmin>
 21             <ymin>205</ymin>
 22             <xmax>572</xmax>
 23             <ymax>547</ymax>
 24         </bndbox>
 25     </object>
 26     <object>
 27         <name>pos_key_up</name>
 28         <pose>Unspecified</pose>
 29         <truncated>0</truncated>
 30         <difficult>0</difficult>
 31         <bndbox>
 32             <xmin>2087</xmin>
 33             <ymin>1011</ymin>
 34             <xmax>2168</xmax>
 35             <ymax>1356</ymax>
 36         </bndbox>
 37     </object>
 38     <object>
 39         <name>pos_key_down</name>
 40         <pose>Unspecified</pose>
 41         <truncated>0</truncated>
 42         <difficult>0</difficult>
 43         <bndbox>
 44             <xmin>2093</xmin>
 45             <ymin>1426</ymin>
 46             <xmax>2176</xmax>
 47             <ymax>1771</ymax>
 48         </bndbox>
 49     </object>
 50     <object>
 51         <name>pos_screen_b5</name>
 52         <pose>Unspecified</pose>
 53         <truncated>0</truncated>
 54         <difficult>0</difficult>
 55         <bndbox>
 56             <xmin>128</xmin>
 57             <ymin>3044</ymin>
 58             <xmax>178</xmax>
 59             <ymax>3136</ymax>
 60         </bndbox>
 61     </object>
 62     <object>
 63         <name>pos_screw_l_down</name>
 64         <pose>Unspecified</pose>
 65         <truncated>0</truncated>
 66         <difficult>0</difficult>
 67         <bndbox>
 68             <xmin>912</xmin>
 69             <ymin>4516</ymin>
 70             <xmax>953</xmax>
 71             <ymax>4594</ymax>
 72         </bndbox>
 73     </object>
 74     <object>
 75         <name>pos_lighting</name>
 76         <pose>Unspecified</pose>
 77         <truncated>0</truncated>
 78         <difficult>0</difficult>
 79         <bndbox>
 80             <xmin>997</xmin>
 81             <ymin>4525</ymin>
 82             <xmax>1282</xmax>
 83             <ymax>4597</ymax>
 84         </bndbox>
 85     </object>
 86     <object>
 87         <name>pos_motor</name>
 88         <pose>Unspecified</pose>
 89         <truncated>0</truncated>
 90         <difficult>0</difficult>
 91         <bndbox>
 92             <xmin>929</xmin>
 93             <ymin>3849</ymin>
 94             <xmax>2039</xmax>
 95             <ymax>4149</ymax>
 96         </bndbox>
 97     </object>
 98     <object>
 99         <name>board_main_1</name>
100         <pose>Unspecified</pose>
101         <truncated>0</truncated>
102         <difficult>0</difficult>
103         <bndbox>
104             <xmin>218</xmin>
105             <ymin>752</ymin>
106             <xmax>777</xmax>
107             <ymax>1383</ymax>
108         </bndbox>
109     </object>
110     <object>
111         <name>board_main_3</name>
112         <pose>Unspecified</pose>
113         <truncated>0</truncated>
114         <difficult>0</difficult>
115         <bndbox>
116             <xmin>197</xmin>
117             <ymin>2339</ymin>
118             <xmax>467</xmax>
119             <ymax>2784</ymax>
120         </bndbox>
121     </object>
122     <object>
123         <name>pos_mic</name>
124         <pose>Unspecified</pose>
125         <truncated>0</truncated>
126         <difficult>0</difficult>
127         <bndbox>
128             <xmin>594</xmin>
129             <ymin>281</ymin>
130             <xmax>667</xmax>
131             <ymax>399</ymax>
132         </bndbox>
133     </object>
134     <object>
135         <name>pos_checknet_l</name>
136         <pose>Unspecified</pose>
137         <truncated>0</truncated>
138         <difficult>0</difficult>
139         <bndbox>
140             <xmin>377</xmin>
141             <ymin>4537</ymin>
142             <xmax>803</xmax>
143             <ymax>4605</ymax>
144         </bndbox>
145     </object>
146     <object>
147         <name>pos_checknet_r</name>
148         <pose>Unspecified</pose>
149         <truncated>0</truncated>
150         <difficult>0</difficult>
151         <bndbox>
152             <xmin>1483</xmin>
153             <ymin>4534</ymin>
154             <xmax>1913</xmax>
155             <ymax>4598</ymax>
156         </bndbox>
157     </object>
158     <object>
159         <name>bolt_b1</name>
160         <pose>Unspecified</pose>
161         <truncated>0</truncated>
162         <difficult>0</difficult>
163         <bndbox>
164             <xmin>1893</xmin>
165             <ymin>609</ymin>
166             <xmax>1928</xmax>
167             <ymax>641</ymax>
168         </bndbox>
169     </object>
170     <object>
171         <name>checkbolt_b2</name>
172         <pose>Unspecified</pose>
173         <truncated>0</truncated>
174         <difficult>0</difficult>
175         <bndbox>
176             <xmin>1321</xmin>
177             <ymin>577</ymin>
178             <xmax>1420</xmax>
179             <ymax>671</ymax>
180         </bndbox>
181     </object>
182     <object>
183         <name>checkbolt_b3</name>
184         <pose>Unspecified</pose>
185         <truncated>0</truncated>
186         <difficult>0</difficult>
187         <bndbox>
188             <xmin>921</xmin>
189             <ymin>579</ymin>
190             <xmax>1019</xmax>
191             <ymax>674</ymax>
192         </bndbox>
193     </object>
194     <object>
195         <name>checkbolt_b4</name>
196         <pose>Unspecified</pose>
197         <truncated>0</truncated>
198         <difficult>0</difficult>
199         <bndbox>
200             <xmin>181</xmin>
201             <ymin>609</ymin>
202             <xmax>273</xmax>
203             <ymax>699</ymax>
204         </bndbox>
205     </object>
206  
207 </annotation>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832083.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx

WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx 1 WIN11 Chrome 双击打不开闪退 1.1 在 Windows 安全中心按照如下步骤操作1.2 右键对应的软件找到应用路径名称1.3 在程序设置按照如下图建立应用名称和后缀相同的命名,如 chrome.exe1.4 按照如下操作步骤打勾选项1…

LVM 使用与扩容总结

转载请注明出处:LVM(Logical Volume Manager,逻辑卷管理器)是一个用于Linux系统的磁盘管理工具。它提供了一种更加灵活的存储管理机制,可以方便地进行磁盘的扩容、缩减、快照以及迁移等操作。 基本概念物理卷(PV):物理磁盘或分区,如/dev/sda1。 卷组(VG):由一个或多…

针对搭建好的Self-Service-Password服务进行背景图片标题修改和去掉问答短信邮件功能选项的展示

官方链接https://ltb-project.org/documentation/index.html https://github.com/ltb-project/self-service-password关于安装我之前已经写了关于安装self-service-password相关的文章,具参考:https://www.cnblogs.com/autopwn/p/18208481修改背景先将要更改的背景图片上传上…

回归

回归时过境迁,上次发完博客后,之后的半年我努力学习,以106分的408分数极限通过了研究生考试初试,之后为了复试机试刷了ACWING,最终顺利通过了复试,被录取为硕士研究生。 进入新学校,技术上开始用java,springboot,mysql增删改查那一套;业务上一开始做开源仓的代码追溯…

开源 - Ideal库 -获取特殊时间扩展方法(四)

分享特殊时间获取的扩展方法,包括获取当前月第一个/最后一个指定星期几、上/下一个指定星期几、月份的第几周、年的第几周(ISO8601)、月份周数、是否周末、是否闰年、所在季度,提供详细代码和单元测试。书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。01、获…

关于Windows外壳(Windows Shell)

在前面的文章中,我介绍过如何替换Windows Shell,将桌面替换为自己的程序。 但是这么做会有个问题,就是桌面环境未被初始化,即使创建了explorer.exe进程,桌面也不会出现。 这里搜集了一些关于WInlogon,LogonUI和Userinit的一些理论知识,有兴趣的小伙伴可以了解一下。Winlo…

如何修复 iPhone 无法通过 Quik App 的蓝牙连接来启动 GoPro Hero13 Black 的解决方案 All In One

如何修复 iPhone 无法通过 Quik App 的蓝牙连接来启动 GoPro Hero13 Black 的解决方案 All In One 最近再使用 GoPro Hero13 Black 的过程中发现 iPhone 经常无法通过 Quik App 的蓝牙唤起 GoPro 开机,需要手动删除 iPhone 的蓝牙匹配,并重新配对 GoPro, 非常麻烦和使用体验极…

VUE使用TS开发打包时发现校验问题无法打包

解决办法: 找到 tsconfig.app.json 这个文件,把他的include改为一个实际存在的空文件即可

企业博客在品牌建设中的作用

在数字营销时代,企业博客已成为品牌建设的重要工具。它不仅帮助企业与目标受众建立联系,还能够提升品牌形象、增强客户忠诚度,并推动销售。本文将探讨企业博客在品牌建设中的关键作用,并结合实际案例分析其效果。 一、建立品牌权威性 企业博客是展示行业知识和专业能力的平…

2024ICPC杭州赛后总结

首先,还是恭喜一下我们队第一次参赛就拿到了,非常的幸运赛前事情还得从网络赛说起,由于我们队网络赛的发挥实在不好,导致最后只得到了一场比赛机会,在选择赛站的时候,就非常的犹豫,我们知道等学长都选完之后,留下给我们的赛站就不多了,我们应该选一个比较有举办经验的…

vm安装ubuntu 20.04 server并用vscode进行ssh远程连接

最近写专业课作业需要用到vscode进行SSH连接ubuntu server,自己摸索了一会终于实现效果,秉承着“取之于网络,还之于网络”的开源精神写了一篇总结博客,欢迎大家参考,如有不足之处也欢迎大家指出。 文章参考: VS Code SSH远程连接Ubuntu_visual studio 连接到本地unbuntu远…