Mat類學習
Opencv中的數據類型與我們常用的數據類型的一一對應關系:Mat_<uchar>->CV_8U;Mat_<char>->CV_8S;Mat_<short>->CV_16S;Mat_<ushort>->CV_16U;Mat_<int>->CV_32S;Mat_<float>->CV_32F;Mat_<double>->CV_64F。
Mat類中depth與type屬性的理解:depth是用來度量每一個像素中每一個通道的精度,但它本身與圖像的通道數無關。depth數值越大,精度越高。type是矩陣的類型,包含矩陣中元素的類型以及通道數信息,type的命名格式為CV_(位數)+(數據類型)+(通道數)。
Mat類中data屬性理解:uchar類型的指針,指向Mat數據矩陣的首地址。
Mat類中可以訪問像素值的函數:1)ptr函數:該函數作用是可以訪問任意一行像素的首地址,格式是image.ptr<數據類型,一般為uchar>(指定的行數);2)at函數:該函數作用是可以訪問圖像中的任意一個像素,格式有兩種,單通道是image.at(i,j);三通道格式如下:藍色通道:image.at(i,j)[0];綠色通道:image.at(i,j)[1];紅色通道:image.at(i,j)[2]。
定義int數據類型的矩陣A,用at函數以double型進行訪問矩陣A的元素,這是不可以的。定義double數據類型的矩陣A,用at函數以int型進行訪問矩陣A的元素,這也是不可以的。因為在定義矩陣的時候,已經確定好了矩陣的元素類型,分配好了相應的矩陣內存,以另外的數據類型格式去訪問的話,類型不匹配。如果要轉換的話,需要在前面加上強制類型轉換符。
Mat是一個類,由兩個數據部分組成:矩陣頭(包含矩陣尺寸、存儲方法、存儲地址等信息)和一個指向存儲所有像素值的矩陣(根據所選存儲方法的不同,矩陣可以是不同的維數)的指針。
Mat類對圖像內存的分配:一般來說,賦值運算符和拷貝構造函數(構造函數)只復制信息頭,不復制整個矩陣,而使用函數clone()或者copyTo()是來復制一幅圖像的矩陣。
Mat類定義對象常用的幾種形式:
1.使用Mat()構造函數
常用的幾種構造函數:1)Mat(int rows,int cols,int type);2)Mat(Size size,int type);3)Mat(int rows,int cols,int type,const Scalar& s);4)Mat(Size size,int type,const Scalar& s);
2.利用create()函數對Mat類進行初始化工作
舉例:Mat B; B.Create(2,2,2,CV_8UC1);
3.利用Matlab式的初始化方式:zeros(),ones(),eye()
舉例:
1)Mat E=Mat::eye(4,4,CV_64F);
2)Mat O=Mat:ones(2,2,CV_32F);
3)Mat Z=Mat::zeros(3,3,CV_8UC1);
4.對小矩陣使用逗號分隔式初始化函數
Mat C=(Mat_(3,3,)<<0,-1,0,-1,5,-1,0,-1,0);
5.為已存在的對象創建新信息頭(使用成員函數clone()和copyTo?