opencv筆記(二十二)——CV_8UC1,CV_32FC3等引數的含義
(一)Mat矩陣(影象容器)建立時CV_8UC1,CV_8UC2等引數詳解
Mat不但是一個非常有用的影象容器類,同時也是一個通用的矩陣類.建立一個Mat物件的方法很多,我們現在先看一下Mat矩陣/影象容器類在OpenCv中的有關原始碼:
使用Mat影象容器類建立Mat類的物件
//! default constructor Mat(); //! constructs 2D matrix of the specified size and type // (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.) Mat(int rows, int cols, int type); Mat(Size size, int type); //! constucts 2D matrix and fills it with the specified value _s. Mat(int rows, int cols, int type, const Scalar& s); Mat(Size size, int type, const Scalar& s); //! constructs n-dimensional matrix Mat(int ndims, const int* sizes, int type); Mat(int ndims, const int* sizes, int type, const Scalar& s);
我們可以看見,建立Mat矩陣/影象容器類的很多構造方法或者其他成員方法在建立Mat物件的時候,都需要指定type--所建立影象/矩陣的型別。 那麼型別是什麼呢?OpenCv的原始碼中說了一句:
(_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.) |
通過轉到定義法,看一下CV_8UC1,CV_64FC3等這些巨集。
這裡的type可以是任何的預定義型別,預定義型別的結構如下所示:
CV_<bit_depth>(S|U|F)C<number_of_channels> |
1--bit_depth---位元數---代表8bite,16bites,32bites,64bites---舉個例子吧--比如說,如
|
建立Mat類物件:
// (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
Mat(int rows, int cols, int type);
通過上面的講解,現在,我們解讀一下OpenCv的原始碼:
//【1】CV_8UC1---則可以建立----8位無符號的單通道---灰度圖片------grayImg
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
//【2】CV_8UC3---則可以建立----8位無符號的三通道---RGB彩色影象---colorImg
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
//【3】CV_8UC4--則可以建立-----8位無符號的四通道---帶透明色的RGB影象
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
(二)Mat矩陣影象容器類建立Mat類物件常用的幾種方法:
- 1)使用Mat矩陣影象容器類的建構函式建立Mat類物件
//【1】載入原始影象1.jpg
int flag;
Mat srcImg=imread("1.jpg",flag); //flag = 0 表示灰度圖; 1表示原圖
//【2】建立一個和原始影象srcImg高和寬一致的8位無符號單通道的灰度圖片容器,並且初始化圖片為白色255
Mat grayImg(srcImg.rows,srcImg.cols,CV_8UC1,Scalar(255));
- 2)為已經存在的IplImage指標建立資訊頭
//【1】宣告IplImg指標
IplImg* imgTopDown;
//【2】將圖片載入到記憶體中
imgTopDown=cvLoadImage("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
//【3】為已經存在的imgTopDown指標建立資訊頭
//【4】轉換IplImage*--->Mat
Mat mtx(imgTopDown);
- 3)利用Create()函式建立Mat矩陣影象容器類的物件
//【1】載入原始影象1.jpg
Mat srcImg=imread("1.jpg",1);
//【2】建立一個和原始影象srcImg高和寬一致的8位無符號單通道的灰度圖片容器,並且初始化圖片為白色255
Mat dstImg.create(srcImg.rows,srcImg.cols,CV_8UC1);
- 4)使用Matlab風格的函式建立Mat矩陣圖形容器類的物件
//! 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】載入原始影象1.jpg
Mat srcImg=imread("1.jpg",1);
//【2】建立一個和原始影象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);