今天讀取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等 這一做法,不僅拉近了產品開發與學術研究的...