天天看點

Mat矩陣(圖像容器)的建立及CV_8UC1,CV_8UC2等參數詳解

一)Mat矩陣(圖像容器)建立時CV_8UC1,CV_8UC2等參數詳解

1--Mat不但是一個非常有用的圖像容器類,同時也是一個通用的矩陣類

2--建立一個Mat對象的方法很多           

3--使用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);12345678910111213

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);123456789

  5--我們可以看見,建立Mat矩陣/圖像容器類的很多構造方法或者其他成員方法在建立Mat對象的時候,都

      需要指定type--所建立圖像/矩陣的類型

  6--那麼類型是什麼呢?OpenCv的源代碼中說了一句: 

    (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)

  7--同樣,我們通過轉到定義法,看一下CV_8UC1,CV_64FC3等這些宏到底是什麼,OpenCv的源代碼顯示

       如下(源代碼在在types_c.h中):

12

#define CV_CN_MAX     512

#define CV_CN_SHIFT   3

#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)

#define CV_8U   0

#define CV_8S   1

#define CV_16U  2

#define CV_16S  3

#define CV_32S  4

#define CV_32F  5

#define CV_64F  6

#define CV_USRTYPE1 7

#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)

#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))

#define CV_MAKE_TYPE CV_MAKETYPE

#define CV_8UC1 CV_MAKETYPE(CV_8U,1)

#define CV_8UC2 CV_MAKETYPE(CV_8U,2)

#define CV_8UC3 CV_MAKETYPE(CV_8U,3)

#define CV_8UC4 CV_MAKETYPE(CV_8U,4)

#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))

#define CV_8SC1 CV_MAKETYPE(CV_8S,1)

#define CV_8SC2 CV_MAKETYPE(CV_8S,2)

#define CV_8SC3 CV_MAKETYPE(CV_8S,3)

#define CV_8SC4 CV_MAKETYPE(CV_8S,4)

#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))

#define CV_16UC1 CV_MAKETYPE(CV_16U,1)

#define CV_16UC2 CV_MAKETYPE(CV_16U,2)

#define CV_16UC3 CV_MAKETYPE(CV_16U,3)

#define CV_16UC4 CV_MAKETYPE(CV_16U,4)

#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))

#define CV_16SC1 CV_MAKETYPE(CV_16S,1)

#define CV_16SC2 CV_MAKETYPE(CV_16S,2)

#define CV_16SC3 CV_MAKETYPE(CV_16S,3)

#define CV_16SC4 CV_MAKETYPE(CV_16S,4)

#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))

#define CV_32SC1 CV_MAKETYPE(CV_32S,1)

#define CV_32SC2 CV_MAKETYPE(CV_32S,2)

#define CV_32SC3 CV_MAKETYPE(CV_32S,3)

#define CV_32SC4 CV_MAKETYPE(CV_32S,4)

#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)

#define CV_32FC2 CV_MAKETYPE(CV_32F,2)

#define CV_32FC3 CV_MAKETYPE(CV_32F,3)

#define CV_32FC4 CV_MAKETYPE(CV_32F,4)

#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

#define CV_64FC1 CV_MAKETYPE(CV_64F,1)

#define CV_64FC2 CV_MAKETYPE(CV_64F,2)

#define CV_64FC3 CV_MAKETYPE(CV_64F,3)

#define CV_64FC4 CV_MAKETYPE(CV_64F,4)

#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

8--這裡的type可以是任何的預定義類型,預定義類型的結構如下所示:

    CV_<bit_depth>(S|U|F)C<number_of_channels>1

     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<number_of_channels>----代表---一張圖檔的通道數,比如:

         1--灰階圖檔--grayImg---是--單通道圖像

         2--RGB彩色圖像---------是--3通道圖像

         3--帶Alph通道的RGB圖像--是--4通道圖像

    9--通過上面的講解,現在,我們解讀一下OpenCv的源代碼:

1

#include <iostream>
using namespace std;
using namespace cv;
int main()
{
    Mat M(2, 2, CV_8UC3, Scalar(2, 255, 255));
    Mat M2(2, 2, CV_8U, Scalar(255));
    Mat M3(2, 2, CV_8UC2, Scalar(1, 255));


    Mat M4(2, 2, CV_16U, Scalar(677, 2, 255));
    Mat M5(2, 2, CV_32F, Scalar(5.34, 3.55, 255));
    cout << M << endl;
    cout << M5 << endl;
    return 0;
}