opencv读matlab中.mat文件

原文地址:http://blog.csdn.net/wzy1990/article/details/8508662

遇到一个问题,需要将matlab中的矩阵用OpenCV打开。故尝试了下在matlab中编辑.xml文件,用opencv中的cvLoad调用。

首先用opencv自带函数生成一个.xml文件

[cpp]  view plain  copy
  1. double a[9]={2,2,3,4,5,6,1,2,2};  
  2. CvMat *testmat=cvCreateMat(3,3,CV_64FC1);  
  3. cvInitMatHeader(testmat,3,3,CV_64FC1,a);  
  4. cvSave("my.xml",testmat);  

打开后格式为

[html]  view plain  copy
  1. <?xml version="1.0"?>  
  2. <opencv_storage>  
  3. <my type_id="opencv-matrix">  
  4.   <rows>3</rows>  
  5.   <cols>3</cols>  
  6.   <dt>d</dt>  
  7.   <data>  
  8.     2. 2. 3. 4. 5. 6. 1. 2. 2.</data></my>  
  9. </opencv_storage>  

在matlab中编写文件,用xmlwrite生成.xml文件

[C++]  view plain  copy
  1. function createxml(name,datatest) % name是输入的文件名,data是matlab中的矩阵(一般都是float格式存储的)  
  2. xdoc=com.mathworks.xml.XMLUtils.createDocument(‘opencv_storage');  
  3. xroot=xdoc.getDocumentElement;  
  4. %  
  5. [m,n]=size(datatest);  
  6. type=xdoc.createElement(name);  
  7. xroot.appendChild(type);  
  8. type.setAttribute(‘ type_id',’ opencv-matrix')  
  9. %  
  10. rows=xdoc.createElement(’ rows');  
  11. rows.appendChild(xdoc.createTextNode(sprintf('%d',m)));  
  12. type.appendChild(rows);  
  13. cols=xdoc.createElement(‘ cols');  
  14. cols.appendChild(xdoc.createTextNode(sprintf('%d',n)));  
  15. type.appendChild(cols);  
  16. dt=xdoc.createElement(‘ dt');  
  17. dt.appendChild(xdoc.createTextNode(sprintf('%s',’ f')));  
  18. type.appendChild(dt);  
  19. data=xdoc.createElement(’ data');  
  20. data.appendChild(xdoc.createTextNode(sprintf('%f ',datatest)));  
  21. type.appendChild(data);  
  22. str=strcat(name,‘ .xml');  
  23. xmlwrite(str,xdoc);  
  24. end  


输出的xml文件第一行<?xml version="1.0" encoding="utf-8"?> 需要删去 encoding="utf-8" 否则会出现opencv不可读的现象。

此时的xml便可以直接用opencv读出了---

测试

 matlab: data=[1,2,3,4,5,6,7,8,9]; createxml(’ test',data)

opencv:

[cpp]  view plain  copy
  1. CvMat* testmat=(CvMat*)cvLoad("test.xml");  
  2. for (int i=0;i<3;i++)  
  3. {  
  4. for (int j=0;j<3;j++)  
  5. {  
  6. cout<<cvGetReal2D(testmat,i,j)<<" ";  
  7. }  
  8. cout<<endl;  
  9. }  


显示结果:


特别要注意,这尼玛有坑,matlab存yml文件,是讲矩阵列方向存储,opencv读取数据,是行方向读取,直接读出来,数据是对不上的。Orz


猜你喜欢

转载自blog.csdn.net/u011630458/article/details/58079111