OpenCV 1 基礎資料結構CvMat

2022-01-28 20:04:41 字數 3430 閱讀 9989

在opencv中,矩陣是乙個基礎的資料結構,在cvcore中。在較早版本裡面,使用的是c語言實現的struct,較新的版本裡面有c++實現的class。下面分別介紹一下這兩種使用方法。

cvmat

參考在opencv的中文首頁上,文件裡面給的還是c實現的結構體。如下,

typedef struct

cvmat

data;

/*data 指標

*/#ifdef __cplusplus

union

;union

;#else

int rows; /*

行數 */

int cols; /*

列數*/

#endif

} cvmat;

對矩陣的操作,參考,

對矩陣的操作,

//

建立矩陣,分配矩陣空間,

cvmat* cvcreatemat(int rows, int cols, int

type);

//type: 矩陣元素型別. 格式為cv_(s|u|f)c.

//例如: cv_8uc1 表示8位無符號單通道矩陣, cv_32sc2表示32位有符號雙通道矩陣.

//釋放矩陣空間,

cvmat* m = cvcreatemat(4,4

,cv_32fc1);

cvreleasemat(&m);

//可以從陣列建立矩陣,

double a = ;

cvmat ma=cvmat(3, 4

, cv_64fc1, a);

//訪問矩陣元素,

//二維浮點數矩陣,

//間接訪問

cvmset(m,i,j,2.0); //

set m(i,j)

t = cvmget(m,i,j); //

get m(i,j)

//直接訪問,

cvmat* m = cvcreatemat(4,4

,cv_32fc1);

int n = m->cols;

float *data = m->data.fl;

data[i*n+j] = 3.0

; //

用陣列初始化矩陣的時候,可以直接運算元組,

double a[16

];

cvmat ma = cvmat(3, 4

, cv_64fc1, a);

a[i*4+j] = 2.0; //

ma(i,j)=2.0;

對於矩陣的其它操作,比如加減乘除,svd分解等,這裡略去。

下面是使用c++的介面,參考

view code

class

cv_exports mat

;

//

建立矩陣,可以使用建構函式,如下,

mat::mat()

mat::mat(

int rows, int cols, int

type)

//如果初始化的時候沒有傳入size的引數,或者後面需要改變size的引數,可以使用create來調整。

create(nrows, ncols, type)

//如下,

//make 7x7 complex matrix filled with 1+3j.

cv::mat m(7,7,cv_32fc2,scalar(1,3

));//

and now turn m to 100x60 15-channel 8-bit matrix.

//the old content will be deallocated

m.create(100,60,cv_8uc(15

));//

釋放資源,可以使用 release()成員函式。

//也可以使用一維或多維陣列來初始化矩陣,

double m[3][3] =, , };

cv::mat m = cv::mat(3, 3

, cv_64f, m);

//元素的訪問,

templatet& mat::at(int i, int

j) template

const t& mat::at(int i, int j) const

template

t& mat::at(int i, int j, int

k) template

const t& mat::at(int i, int j, int k) const

//i, j, k – indices along the dimensions 0, 1 and 2, respectively

//在矩陣是行向量或列向量的時候,也可以只用乙個引數來訪問元素。

//類似於c++裡面的迭代器,mat也可以使用iterator。

另外有兩個問題稍作討論,

cvcreatemat的使用,

void create(cvmat*& mat,int rows,int

cols)

//void create(cvmat* mat,int rows,int cols)

一開始使用的是注釋掉的那一行,在呼叫這個函式之後,mat本應該被初始化的,但在後面的訪問中會出現問題,後來將引數改為指標引用,才解決錯誤。

另乙個問題是c++裡面矩陣的定義是cv::mat,但在很多舊的函式裡面,要求傳入的引數是cvmat*,如何進行轉換呢?

這裡很多都只適用於2維矩陣,對於多維的矩陣,opencv也是支援的。opencv裡面矩陣的大小為rows*cols,但在每個位置,由channel控制這個點的維數。比如複數矩陣,這個點可以用2個channels來表示乙個複數。元素訪問的時候可以使用i,j,k三個引數。

參考,或者在定義資料型別的時候,不是使用cv_32fc3之類的,而是自定義型別,比如

struct

elem

那麼就可以先訪問到elem,然後再通過elem訪問f1和f2.

就這麼多吧,隨便整理的一些,沒有辦法靜下來好好整理。

乙個簡單的例項程式如下,

//

test for cvcreatemat

#include

"cxcore.h

"#include

//void create(cvmat*& mat,int rows,int cols)

void create(cvmat*& mat,int rows,int

cols)

void init(cvmat*mat)

}}void print(cvmat*mat)

printf("\n

");}

}int

main()

OpenCV基礎資料結構

opencv基礎資料結構圖譜 影象資料結構 ipl 影象 iplimage int nchannels 色彩通道數 1,2,3,4 int depth 象素色深 ipl depth 8u,ipl depth 8s,ipl depth 16u,ipl depth 16s,ipl depth 32s,i...

opencv基礎資料結構

point 類不用多言,裡面兩個成員變數x,y。point 就是point2i,也是point,point 就是point2f,point 就是point2d。point3 類不太常用,跟point 類差不太多,成員變數x,y,z。size 類成員變數width height。size 就是size...

openCV之基礎資料結構

被乙個同學拉去面試乙個團隊,抱著試試看的心態去,竟然以後打算往人工智慧或者遊戲開發上面靠,計算機圖形學是必須要學的了。於是面試他們的影象處理組,最後陰差陽錯的進了。竟然進了就好好對待吧。opencv擼起來。這兩天看了一些部落格,還有借了 opencv計算機視覺程式設計攻略 來看。打算繼續用部落格的方...