版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/u014686356/article/details/52824565 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div class="htmledit_views" id="content_views">
问题描述:
最近在做实验的时候,用的是OpenCV,需要将矩阵通过图表的方式显示出来,例如:直方图。But 我不太会用OpenCV将图表显示出来。此时此刻,想到了强大的软件Matlab。但是,数据是用OpenCV中的FileStorage方法用xml文件将矩阵进行存储。Matlab如何将矩阵进行读入是关键。
网上有很多的方法,但是感觉对像我这样存储的用户太过复杂,于是就写一篇简单的,希望能帮助到大家。
解决办法
OpenCV中将矩阵写入xml文件的方法很简单,利用FileStorage方法,基本三行就可以搞定。
-
FileStorage mul_wr(".\\0.xml", FileStorage::WRITE);
-
mul_wr <<
"result" << result;
-
mul_wr.release();</span>
最后得到的xml文件结构如下所示(只给出一部分):
-
<?xml version="1.0"?>
-
<opencv_storage>
-
<result type_id="opencv-matrix">
-
<rows>50000
</rows>
-
<cols>1
</cols>
-
<dt>d
</dt>
-
<data>
-
2.8882032819301821e+002 -6.8150904489448294e-001
-
4.5750426905229688e+001 1.8478395644389093e+002
-
-1.3984500984381884e+002 -5.2998318639583886e+001
-
2.6773534634662792e+002 1.1899971175007522e+000
-
-7.5492174654966220e+001 2.1866303959977813e+002
-
-1.3364549682929646e+002 1.7896846196893603e+002
-
9.4229298247839324e+001 1.0382060136087239e+002
-
3.3998946248553693e+001 -1.5178917868062854e+002
-
1.5348514711554162e+002 3.8458418705937220e+001
-
7.1695511569269001e+001 -8.9653154644649476e+001
-
4.4976377896527993e+000 2.7091610717397998e+002
-
2.4743137456942350e+001 -1.1738243190571666e+001
-
2.0047841143980622e+002 1.6443823127949145e+001
-
</data>
</result>
-
</opencv_storage>
下面,就用上面这个例子,用Matlab 代码将矩阵进行读入代码如下所示:
-
<span style=
"font-size:18px;">function opencv2matlab()
-
-
% 读取opencv中xml文件,表示的是矩阵。
-
xmlDoc = xmlread(
'0.xml');
-
%得到矩阵的行数,如果存储了多个矩阵,可以进行循环 item(i)
-
row = xmlDoc.getElementsByTagName(
'rows').item(
0).getFirstChild.getData;
-
%得到矩阵的列数
-
col = xmlDoc.getElementsByTagName(
'cols').item(
0).getFirstChild.getData;
-
row = str2num(row);%读入是
string类型,转为数字;
-
col = str2num(col);%同上
-
-
%读入矩阵,这里注意,矩阵的行数和列数跟xml存储的方式相同,例如,这里是
25000x2,所以读入的矩阵是
25000x2
-
histstring =
char(xmlDoc.getElementsByTagName(
'data').item(
0).getFirstChild.getData);
-
%对矩阵进行处理,得到原来的矩阵
-
-
%将
char类型转为数字类型
-
hists = str2num(histstring);
-
last = eye(row,col,
'double');
-
[a,b] = size(hists);
-
k =
1;
-
%disp();
-
n =
1;
-
for i=
1:a
-
for j =
1:b
-
m=
1;
-
last(n,m) = hists(i,j);
-
m= m+
1;
-
if m==col
-
n = n+
1;
-
end
-
end
-
end
-
[a,b] = size(last);
-
disp(last);
-
end</span></span>
这里得到的矩阵last就是OpenCV处理后的数据,就可以用个数据,在matlab平台上进行数据处理。
其他小知识
matlab中可以用class(var)查询数据var的类型,例如var是double类型,这class(var)就是double;
matlab中可以用str2num(a),将string类型转化为数字类型。
祝大家学习健康,生活快乐!!!