加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

OpenCV保存成XML(FileStorage)和CSV(重载<<运算符)文

发布时间:2020-12-16 08:57:17 所属栏目:百科 来源:网络整理
导读:使用OpenCV时不仅要保存影像结果,往往也需要保存中间的矩阵结果,而OpenCV的imwrite函数只支持CV8U类型的数据( 使用OpenCV保存其他类型Mat的时候,程序不会报错,但是无法生成结果文件 ),因此会给工作带来很多不便。OpenCV在2.0以后的版本中提供了FileSt


使用OpenCV时不仅要保存影像结果,往往也需要保存中间的矩阵结果,而OpenCV的imwrite函数只支持CV8U类型的数据(使用OpenCV保存其他类型Mat的时候,程序不会报错,但是无法生成结果文件),因此会给工作带来很多不便。OpenCV在2.0以后的版本中提供了FileStorage类,供用户直接使用,保存为XML/YAML文件。

保存XML

保存示例如下:

<span style="color: rgb(51,51); font-family: 'Source Code Pro',monospace; font-size: 14px; line-height: 20.2999992370605px; white-space: pre; background-color: rgba(128,0.0470588);">Mat mat </span><span class="hljs-subst" style="box-sizing: border-box; font-family: 'Source Code Pro',0.0470588);">=</span><span style="color: rgb(51,0.0470588);"> Mat</span><span class="hljs-tag" style="color: rgb(0,102); box-sizing: border-box; font-family: 'Source Code Pro',0.0470588);">::eye</span><span style="color: rgb(51,0.0470588);">(Size(</span><span class="hljs-number" style="color: rgb(0,0.0470588);">12</span><span style="color: rgb(51,0.0470588);">,</span><span class="hljs-number" style="color: rgb(0,0.0470588);">),CV_8UC1);</span>
 
 
 

得到结果文件如下所示:

<span class="hljs-pi" style="color: rgb(0,0.0470588);"><?xml version="1.0"?></span>
 
 
<span class="hljs-tag" style="color: rgb(0,136);">rows</span>></span><span style="color: rgb(51,0.0470588);">12</span><span class="hljs-tag" style="color: rgb(0,0.0470588);"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0,136);">cols</span>></span><span style="color: rgb(51,136);">dt</span>></span><span style="color: rgb(51,0.0470588);">u</span><span class="hljs-tag" style="color: rgb(0,136);">data</span>></span><span style="color: rgb(51,0.0470588);">    1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0   </span>
 
 
 
 
 
 
 

需要注意的是,因为保存的结果为xml文件,所以再保存的时候需要给定标签,格式就是下面的形式,先存储标签内容,再存储矩阵:

 

读取XML

同样使用FileStorage类可以直接获取保存的xml文件内容。
读取示例如下:

 
 
 

读取文件的时候同样要给定标签内容,这里通过中括号[]给定:

 

CSV文件

很多时候,直接使用CSV文件相比XML更方便,使用XML保存得到的数据,无论是查看(excel查看,XML中矩阵不是格式化的)还是接着使用别的工具处理(例如matlab),都可以快速的读取,而XML需要解析则比较繁琐。那么该如何保存CSV文件呢,对保存的CSV文件又应该如何读取呢,请看下文分解。

保存CSV文件

OpenCV提供了结果保存的格式化函数format,使用format我们就可以根据自己想要的格式打印和保存数据了。

先直接看保存函数,再来分析具体含义吧:

<span class="hljs-keyword" style="color: rgb(0,0.0470588);"> << </span><span class="hljs-keyword" style="color: rgb(0,0.0470588);">format</span><span style="color: rgb(51,0.0470588);">(mat,Formatter::FMT_CSV);</span>
 

根据上面的代码只用ofstream对象打开要写入的csv文件,再直接写入数据即可,需要注意的是,接入的矩阵用format格式化,format函数第二个参数表示格式类型,这里选择CSV格式即Formatter::FMT_CSV

保存结果如图所示:

这里保存格式为定义在Formatter类中的枚举类型,总共有6中选项,各位读者可以根据自己的需求选择。

<pre class="prettyprint" name="code" style="margin-top: 0px; margin-bottom: 1.1em; white-space: nowrap; word-wrap: break-word; box-sizing: border-box; font-family: 'Source Code Pro',0.0470588);"><span style="line-height: 20.2999992370605px; white-space: pre;">class CV_EXPORTS Formatter{</span>
 
 
 
 
 
<span style="line-height: 20.2999992370605px; white-space: pre;">};</span>

 

读取CSV数据

在保存为CSV格式后该如何读取呢,这里可以使用OpenCV中ml模块的TrainData类的函数读取。具体代码如下所示,第二行为加载数据,参数0表示没有标题行,第三行获取得到的数据。

 
 
 
 

代码运行结果为:

参考链接:
1.OpenCV使用FileStorage保存Mat数据
2.XML/YAML file storages. Writing to a file storage.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读