項目須要將matlab代碼寫成C++,準備用opencv。opencv中矩陣的存儲與matlab有所不一樣,應注意如下問題:函數
一、matlab中矩陣是按照列優先存儲的。對於n0*n1*...*nn維的矩陣,具體存儲方式是:(a0(0),a1(0),...,an(0)),(a0(1),a1(0),...an(0)), (a0(n0),a1(0),...an(0)),(a0(0),a1(1),a2(0),...an(0)),...(a0(0),a1(0),...,an(nn)).即先遍歷a0,再遍歷a1,a2,...,an.內存
二、opencv中矩陣的存儲方式是行優先的,與matlab相反。opencv
三、對於三維矩陣,在opencv中我常使用一個多通道的二維矩陣代替。如建立一個100*10*20的矩陣:遍歷
Mat a(100,10,CV_32SC(20));方法
也能夠直接建立一個三維矩陣:項目
int sz[]={100,10,20};
matlab
Mat a(sz,CV_32S);co
四、對於遍歷矩陣的操做,儘可能使矩陣元素在內存中連續。我常使用下面的方法遍歷矩陣:data
double *data=(double *)a.data;ab
for(int i=0;i<a.rows;++i){
for(int j=0;j<a.cols;++j){
*(data++)=........
}
}
五、矩陣的初始化
opencv新建一個矩陣後並不會自動初始化,若是須要初始化須要自行操做。opencv提供了setTo函數:
//初始化一個32通道的矩陣,第32通道初始化爲1,其餘通道初始化爲0
Mat a(100,100,CV_32SC(32));
Vec<int,32>val;
val=0;
val[31]=1;
a.setTo(val);