opencv是由c語言實現的,實際上它使用的結構體也是遵循物件導向思想設計的,iplimage由cvmat派生
資訊)和乙個指向儲存所有畫素值的矩陣(根據所選儲存方法的不同矩陣可以是不同的維數)的指標。
mat矩陣頭:包括
typedef struct cvmat每個 mat 物件有自己的資訊頭,但共享同乙個矩陣。這通過讓矩陣指標指向同一位址而實現。而拷貝構造data;
#ifdef __cplusplus
union
;union
;#else
int rows;
int cols;
#endif
}cvmat;
函式則 只拷貝資訊頭和矩陣指標 ,而不拷貝矩陣。
mat 不但是乙個很讚的影象容器類,它同時也是乙個通用的矩陣類,所以可以用來建立和操作多維矩陣
直接從讀入;使用拷貝建構函式;使用賦值運算子;
mata,c;// 只建立資訊頭部分a=
imread
(argv[1
],cv_load_image_color
);// imread讀取影象(第乙個引數為影象路徑需傳入,第二個是影象顏色型別
matb(a);// 使用拷貝建構函式c=
a;// 賦值運算子
matd(以上**中的所有mat物件最終都指向同乙個也是唯一乙個資料矩陣,最後乙個使用mat的物件會負責清理。a,rect(10
,10,100
,100));
//對a建立乙個rio感興趣區域
mate=a
(range:
all(),
range(1
,3));// 使用range函式利用a的行列賦值給
如果想拷貝矩陣本身(不只是資訊頭和矩陣指標),這時可以使用函式 clone() 或者 copyto()。
matf=a.clone
();matg;
a.copyto(g
);
使用mat矩陣影象容器類的建構函式建立mat類物件
//載入原始影象1.jpg
//建立乙個和原始影象srcimg高和寬一致的8位無符號單通道的灰度容器,並且初始化為白色255
mat grayimg(srcimg.
rows,srcimg.cols,cv_8uc1,scalar(255));
為已經存在的iplimage指標建立資訊頭
//宣告iplimg指標
iplimg* imgtopdown;
//將載入到記憶體中
//為已經存在的imgtopdown指標建立資訊頭
//轉換iplimage*--->mat
mat mtx(imgtopdown);
利用create()函式建立mat矩陣影象容器類的物件
//【1】載入原始影象1.jpg
//【2】建立乙個和原始影象srcimg高和寬一致的8位無符號單通道的灰度容器,並且初始化為白色255
mat dstimg.create(srcimg.rows,srcimg.cols,cv_8uc1);
//! matlab-style matrix initialization
static matexpr zeros(int rows, int cols, int type);
static matexpr zeros(size size, int type);
static matexpr zeros(int ndims, const
int* sz, int type);
static matexpr ones(int rows, int cols, int type);
static matexpr ones(size size, int type);
static matexpr ones(int ndims, const
int* sz, int type);
static matexpr eye(int rows, int cols, int type);
static matexpr eye(size size, int type);
//載入原始影象1.jpg
//建立乙個和原始影象srcimg高和寬一致的8位無符號單通道的灰度容器,並且初始化為白色255
mat dstimg=mat::zeros(srcimg.rows,srcimg.cols,cv_8uc3);
mat dstimg=mat::ones(srcimg.rows,srcimg.cols,cv_8uc3);
mat dstimg=mat::eye(srcimg.rows,srcimg.cols,cv_8uc3);
type--所建立影象/矩陣的型別
這裡的type可以是任何的預定義型別,預定義型別的結構如下所示:
cv_(s|u|f)c
1--bit_depth---位元數---代表8bite,16bites,32bites,64bites---舉個例子吧--比如說,如
如果你現在建立了乙個儲存--灰度的mat物件,這個影象的大小為寬100,高100,那麼,現在這張
灰度中有10000個畫素點,它每乙個畫素點在記憶體空間所佔的空間大小是8bite,8位--所以它對
應的就是cv_8
2--s|u|f--s--代表---signed int---有符號整形
u--代表--unsigned int--無符號整形
f--代表--float---------單精度浮點型
3--c----代表---一張的通道數,比如:
1--灰度--grayimg---是--單通道影象
2--rgb彩色影象---------是--3通道影象
3--帶alph通道的rgb影象--是--4通道影象
--通過上面的講解,現在,我們解讀一下opencv的源**:
原部落格://cv_8uc1---則可以建立----8位無符號的單通道---灰度------grayimg
#define cv_8uc1 cv_maketype(cv_8u,1)
#define cv_8uc2 cv_maketype(cv_8u,2)
//cv_8uc3---則可以建立----8位無符號的三通道---rgb彩色影象---colorimg
#define cv_8uc3 cv_maketype(cv_8u,3)
//cv_8uc4--則可以建立-----8位無符號的四通道---帶透明色的rgb影象
#define cv_8uc4 cv_maketype(cv_8u,4)
OpenCV中Mat 型別學習筆記
printf img.size 函式返回值 n cout 報錯 原因,mat.step1 0 需要用圓括弧 mat的step,size,step1,elemsize,elemsize1這幾個屬性非常容易混淆。opencv的官方參考手冊也沒有解釋清楚這幾個概念。step1 i 每一維元素的通道數 st...
OpenCV學習筆記七 關於Mat類
1 建立乙個mat物件僅僅是建立了資訊頭部分,並沒有複製影象矩陣,而是通過矩陣指標指向某一位址而實現。eg mat a,c 僅建立資訊頭部分 mat b a 使用拷貝建構函式 c a 賦值運算子 以上建立的所有mat物件最終都指向同乙個也是唯一的乙個資料矩陣。雖然資訊頭不同,但是通過任何乙個物件所做...
opencv學習筆記之Mat元素訪問
mat元素訪問方法如下 declare template tp cv mat at int i0 0 cv mat h 100 100 cv 64f 初始化 for int i 0 i h.rows i for int j 0 j h.cols j h.at double i,j 1.i j 1 賦...