OpenCV中的XML解析器

4

我有一个名为locations.xml的文件,其中包含图像文件名以及在相应图像上绘制矩形的位置。XML节点结构如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<tagset>
  <image>
    <imageName>ryoungt_05.08.2002/aPICT0034.JPG</imageName>
    <resolution x="960" y="1280" />
    <taggedRectangles>
      <taggedRectangle x="196.0" y="901.0" width="111.0" height="67.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="116.0" y="896.0" width="59.0" height="69.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="442.0" y="794.0" width="424.0" height="67.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="212.0" y="793.0" width="200.0" height="66.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="99.0" y="560.0" width="302.0" height="76.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="107.0" y="791.0" width="84.0" height="66.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="512.0" y="682.0" width="366.0" height="74.0" offset="0.0" rotation="0.0" userName="admin" />
      <taggedRectangle x="104.0" y="678.0" width="376.0" height="73.0" offset="0.0" rotation="0.0" userName="admin" />
    </taggedRectangles>
  </image>

我需要在OpenCV中打开此文件,并读取其中的内容。对于XML文件中的每个图像文件名,相应的图像将在窗口中打开,并在相应的图像上绘制矩形。
基本上,我需要打开这些文件并查看矩形,以便将其与使用文本检测算法在同一图像上绘制的矩形进行匹配。但是,处理XML文件让我感到困惑。如果有任何帮助,将不胜感激。

如果这是您的 XML 文件,您可以将其从 JSON 切换到 XML 并节省解析时间。因为 JSON 解析比 XML 更简单和更快速。 :) - Evgen Bodunov
1
JSON不是一个选项,因为所有的文件都不是我的。而且我还不知道JSON的任何信息。我将不得不弄清楚如何将JSON解析器的结果合并到OpenCV函数参数中。 - Riddhiman Dasgupta
3个回答

2
OpenCV提供了一些(反)序列化工具,支持XML、YAML和JSON文件格式。您可以直接将XML反序列化为OpenCV对象。请看这个示例。
但是,仅在涉及OpenCV的两端时才有用。XML解析器需要标签。

2

1
是的,我考虑过使用TinyXML或者更全面的解析器,但是对于我的简单需求,我需要使用不同的解析器吗?在OpenCV中,没有使用内置的XML/YAML处理函数的方法吗? - Riddhiman Dasgupta

0

有一种巧妙的方法可以在紧急情况下使用OpenCV解析XML文件,而不需要<opencv_storage>标签。这种方法是将XML文件读入字符串,添加<opencv_storage>标签对,然后以FileStorage::MEMORY模式打开该字符串,就像这样:

std::ifstream stm("foo.xml");
std::stringstream buffer;
buffer << "<opencv_storage>\n"<<stm.rdbuf()<<"</opencv_storage>\n";
string fileContent =buffer.str();
FileStorage fs(fileContent, FileStorage::READ|FileStorage::MEMORY);

它显然有局限性,但有时比引入XML读取器依赖项更容易。


这是一个关于 C 的问题,不是关于 C++ 的问题。 - Willis Hershey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接