Opencv中Mat陣列相關應用

2021-07-24 12:18:39 字數 1952 閱讀 1040

今天讀取opencv中的mat陣列,已經被打敗,真的是型別不對就讀不出內容啊,真的要崩潰,故特此記錄一下。

1、首先了解一下mat中對應的各個型別

在opencv中畫素點的資料型別能找到對應類似char,int,float,double的,比如說是分別為cv_8uc1,cv_16uc1,cv_32fc1, cv_64fc1,一定要注意是沒有這一說法的cv_16fc1。

當mat中資料的型別為cv_16uc1的時候,這裡的16u並不是指unsigned int,而是指的是unsigned short int,因為在opencv框架中,int不是16位的,而是32位的

2、建立mat陣列

mat matpixel(rows, cols, types, scalar(0));

例如:mat matpixel(src.rows*src.cols, 2, cv_16uc1, scalar(0));

3、取值:

mat讀元素值得**為:

//對於乙個資料型別為type的mat a來說  

type temp = a.at(x,y);

當採用這種方法取元素值得時候,type成為乙個麻煩的問題,因為一般我們生成mat的時候,都是這樣的:

mat a;  

a.create(size(x,y), cv_8uc1);

而取元素值時不能寫成"a.at(x,y)"或者"a.at(x,y)"。

所以這裡列出opencv中定義的型別和c++中型別的對應關係,

cv_8sc1 -> char

cv_8uc1 -> unsigned char

cv_16sc1

-> short

cv_16uc1

-> unsigned short

cv_32sc1

-> int

cv_32fc1

-> float

cv_64fc1

-> double

opencv中的資料型別命名規則為:cv_(位元數)+(資料型別)+(channel數),我們也可以直接根據命名規則得到相應的資料型別。

下面舉例:

cv_16uc1型別的資料,訪問畫素(i,j)

img.at(i,j)即可。

若不知道所屬的屬性,則可以通過轉變資料型別進行獲取值。本人一般喜歡轉為double型,**如下:

mat dta;//位置其資料型別	

mat data = cv::mat_(_data);//資料型別轉換為double

int n = data.rows;

int d = data.cols;

/// mean

mat m = mat::zeros(1, d, data.type());//如果想新建乙個相同資料型別的陣列,使用type()即可

for (int j = 0; j(0, j) += data.at(i, j);

} }

//對於單通道影象  

//0表示讀取的灰度影象(彩色影象將轉換成灰度影象)  

//對於彩色影象  

//裡面包含三個元素:elem_3.val[0]、elem_3.val[1]、elem_3.val[2]

Opencv中資料結構Mat的相關屬性

the class mat represents an n dimensional dense numerical single channel or multi channel array.it can be used to store real or complex valued vectors...

OpenCV中mat記憶體管理

opencv中大部分物件都像被std share ptr包裝過的行為一樣,你不需要自己手動釋放資源。同標準庫的智慧型指標一樣,你不需要自己去手動刪除指標,也許對於被智慧型指標管理的物件,根本就不建議你直接使用指標。所有的物件都應該建立在棧上,使用 object obj 的方式獲得物件,而不應該使用o...

opencv中mat詳細解析

1 起源 opencv作為強大的計算機視覺開源庫,很大程度上參考了matlab的實現細節和風格,比如說,在opencv2.x 版本以後,越來越多的函式實現了matlab具有的功能,甚至乾脆連函式名都一模一樣 如 imread,imshow,imwriter等 這一做法,不僅拉近了產品開發與學術研究的...