因为现在下到的数据集大部分都使用了Matlab的Calibration toolbox 进行标定,其结构大部分是.mat结构的,所以它和opencv中数据传递需要一个中间过程,网上也有直接调用matlab的dll的方法,但是中间件方法必然会受到版本限制,所以我最后还是选择了使用xml来作为中间文件传递数据。

--------------1.calibration toolbox原始标定的.m数据--------------
 
http://ishare.iask.sina.com.cn/f/67004587.html
 
--------------2.通过matlab根据opencv的存储格式写成的xml文件--------------

http://ishare.iask.sina.com.cn/f/67004482.html
 
 
--------------3.matlab端转换代码--------------
 
function  writeXML(
name,fc,kc,alpha_c,cc,om,t )
%WRITEXML write mat to xml
file
%   this function is
used to convert matrix information from matlab to
%   opencv
kk=[fc(1) alpha_c*fc(1) cc(1); 0 fc(2)
cc(2);0 0 1];
 
%write FC
xdoc=com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xroot=xdoc.getDocumentElement;
[m,n]=size(fc);
 
type=xdoc.createElement_x_x_x_x_x('fc');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',fc(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
%write KC
[m,n]=size(kc);
type=xdoc.createElement_x_x_x_x_x('kc');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',kc(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
 
%write ALPHA_C
[m,n]=size(alpha_c);
type=xdoc.createElement_x_x_x_x_x('alpha_c');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',alpha_c(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
 
%write CC
[m,n]=size(cc);
type=xdoc.createElement_x_x_x_x_x('cc');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',cc(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
%write KK
[m,n]=size(kk);
type=xdoc.createElement_x_x_x_x_x('kk');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',kk(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
 
%write OM
[m,n]=size(om);
type=xdoc.createElement_x_x_x_x_x('om');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',om(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
%write T
[m,n]=size(t);
type=xdoc.createElement_x_x_x_x_x('t');
type.setAttribute('type_id','opencv-matrix')
xroot.a(type);
 
rows=xdoc.createElement_x_x_x_x_x('rows');
rows.a(xdoc.createTextNode(sprintf('%d',m)));
type.a(rows);
 
cols=xdoc.createElement_x_x_x_x_x('cols');
cols.a(xdoc.createTextNode(sprintf('%d',n)));
type.a(cols);
 
dt=xdoc.createElement_x_x_x_x_x('dt');
dt.a(xdoc.createTextNode(sprintf('%s','d')));
 
type.a(dt);
data=xdoc.createElement_x_x_x_x_x('data');
for i=1:m
   
for j=1:n
   
   
data.a(xdoc.createTextNode(sprintf('%d',t(i,j))));
   
   
 data.a(xdoc.createTextNode(sprintf('%s','
')));
   
end
end
type.a(data);
 
 
 
str=strcat(name,'.xml');
xmlwrite(str,xdoc);
end
 
--------------4.C++读取代码--------------
 
 
#include"highgui.h"
#include"cv.h"
#include
#include
#include
using namespace
 std;
using namespace cv;
int main(void)
{
//*********Read XML
Example*********
//1.cvFileStorage write XML
Example
int a=1;
float b=2;
double c[]={3,5,6,6};
CvMat
*mat=cvCreateMat(3,3,CV_32SC1);
cvSetIdentity(mat);
CvFileStorage
*fs=cvOpenFileStorage("test1.xml",0,CV_STORAGE_WRITE);
cvWriteComment(fs,"my
data",1);
cvStartWriteStruct(fs,"DATA",CV_NODE_MAP,0,cvAttrList(0,0));
 
cvStartWriteStruct(fs,"c",CV_NODE_SEQ,0,cvAttrList(0,0));
cvWriteRawData(fs,c,4,"d");
cvEndWriteStruct(fs);
cvSave("mat.xml",mat);
cvWriteInt(fs,"a",a);
cvWriteReal(fs,"b",b);
cvStartWriteStruct(fs,"c",CV_NODE_SEQ,0,cvAttrList(0,0));
cvWriteRawData(fs,c,4,"d");
cvEndWriteStruct(fs);
cvReleaseFileStorage(&fs);
cvReleaseMat(&mat);
 
 
//2.Mat to
XML 
CvMat
*writemat=cvCreateMat(3,3,CV_64FC1);
cvSetIdentity(writemat);
cvSave("test.xml",writemat);
 
 
//*********Read XML
Example*********
   
//1. Direct read sigle CvMat Example
 
CvMat *testmat=(CvMat
*)cvLoad("test.xml");
for(int i=0;irows;i++)
{
for(int j=0;jcols;j++)
cout<<CV_MAT_ELEM(*testmat,double,i,j)<<"
";
cout<<endl;
 
}
system("PAUSE");
//2.File Storage multi dataset
Example
FileStorage fss;
fss.open("cam1.xml",FileStorage::READ);
Mat
fc,cc,kc,alpha_c,kk,om,t;
fss["fc"]>>fc;
fss["cc"]>>cc;
fss["kc"]>>kc;
fss["alpha_c"]>>alpha_c;
fss["kk"]>>kk;
fss["om"]>>om;
fss["t"]>>t;
cout<<"fc:"<<endl<<fc<<endl;
cout<<"cc:"<<endl<<cc<<endl;
cout<<"kc:"<<endl<<kc<<endl;
cout<<"alpha_c:"<<endl<<alpha_c<<endl;
cout<<"kk:"<<endl<<kk<<endl;
cout<<"om:"<<endl<<om<<endl;
cout<<"t:"<<endl<<t<<endl;
fss.release();
system("PAUSE");
return 0;
 
}
通过上面的过程,就可以在matlab和opencv中间传递数据了,看似很麻烦,但是实际使用
上经过模块化是非常方便的,尤其是有大量的矩阵需要传递的时候,在传递中采用了逐个mat读取的方法,当然,要传递的矩阵不多的时候,可以采用合并矩阵,
用cvload读取后再分割出所需数据的方法,这种方法的效率应该更高,但是需要已知传递的矩阵结构
 
from: http://blog.sina.com.cn/s/blog_5e3213f30101hdt6.html

OpenCV和Matlab 通过XML传递数据的更多相关文章

  1. ajax 用xml传递数据

    页面代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Index.aspx. ...

  2. 使用XML传递数据

    HTML <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  3. Android中Service通信(一)——启动Service并传递数据

    启动Service并传递数据的小实例(通过外界与服务进行通信): 1.activity_main.xml: <EditText android:layout_width="match_ ...

  4. activity与fragment之间传递数据

    总结:无论是activity给fragment传递数据,还是fragment给activity传递数据,都把activity和fragment都当做一个普通的对象,调用它的方法,传递参数. 1.Fra ...

  5. 3.SpringMVC修改配置文件路径和给界面传递数据

    1.修改配置文件路径  达到  配置多文件的目的 web.xml文件中基础配置有springMVC配置的servlet路径 <servlet-name>SpringMVC</serv ...

  6. 通过Application传递数据代码

    使用Application传递数据步骤如下:创建新class,取名MyApp,继承android.app.Application父类,并在MyApp中定义需要保存的属性     在整个Android程 ...

  7. WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据

    数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...

  8. MVC中前台如何向后台传递数据------$.get(),$post(),$ajax(),$.getJSON()总结

    一.引言 MVC中view向controller传递数据的时候真心是一个挺让人头疼的一件事情.因为原理不是很懂只看一写Dome,按葫芦画瓢只能理解三分吧. 二.解读Jquery个Ajax函数 $.ge ...

  9. Android 消息广播Intent传递数据

    1.创建布局文件activity_broadcast.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

随机推荐

  1. 洛谷P1482 Cantor表(升级版) 题解

    题目传送门 此题zha一看非常简单. 再一看特别简单. 最后瞟一眼,还是很简单. 所以在此就唠一下GCD大法吧: int gcd(int x,int y){ if(x<y) return gcd ...

  2. [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1749  Solved: 885[Submit][Status][ ...

  3. 报错org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet"

    org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n ...

  4. SQL Server 执行计划分析

    当一个查询到达数据库引擎时,SQL Server执行两个主要的步骤来产生期望的查询结果: 第一步:查询编译,生成查询计划. 第二步:执行这个查询计划. 1. 用于演示分析执行计划的查询语句 /* 查询 ...

  5. 牛客网 牛客练习赛43 B.Tachibana Kanade Loves Probability-快速幂加速

    链接:https://ac.nowcoder.com/acm/contest/548/B来源:牛客网 Tachibana Kanade Loves Probability 时间限制:C/C++ 1秒, ...

  6. 初拾Java(问题一:404错误,页面找不到)

    做测试尤其是想走自动化测试之路的人,怎么可以不会码代码?!怒了... 再次开始拾起Java,坚持坚持!!! 刚写了一个JSP页面,想在Myeclipse里面跑来试试,结果搞了半天出现以下错误: 试着去 ...

  7. openstack newton linuxbridge 改成 ovs

    最近搭建了一个all in one 的 openstack newton 版,安装官方文档做用的是linuxbridge.已经老版玩的时候都是用的ovs,趁比较闲的时候也将N版改造一下 官方文档 ht ...

  8. HDU 6141 I am your Father!(最小树形图)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] ...

  9. 【费用流】BZOJ1927-[Sdoi2010]星际竞速

    [题目大意] 有一些点,它们之间存在一些有向边(由编号小的到编号大的),从一点到另一点消耗时间为边长.也可以消耗Ti时间直接抵达任意一个点.问所有点都走一遍最少需要多少时间? [思路] ①将每个点i拆 ...

  10. 升级到php7和安装拓展(mac centos)

    Mac升级到php7 使用homebrew安装php7 brew update #更新源 brew search php #查找源中的php,发现有php7.1版本,安装最新的php7.1 brew ...