1. 程式人生 > >OpenCv學習筆記(二)--Mat矩陣(影象容器)的建立及CV_8UC1,CV_8UC2等引數詳解

OpenCv學習筆記(二)--Mat矩陣(影象容器)的建立及CV_8UC1,CV_8UC2等引數詳解


(一)Mat矩陣(影象容器)建立時CV_8UC1,CV_8UC2等引數詳解

1--Mat不但是一個非常有用的影象容器類,同時也是一個通用的矩陣類
2--建立一個Mat物件的方法很多,我們現在先看一下Mat矩陣/影象容器類在OpenCv中的有關原始碼:

  
  • 1
  • 2

    3--使用Mat影象容器類建立Mat類的物件

  
  • 1
    //! 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4--使用Matlab風格的函式建立或者初始化Mat類的物件

  
  • 1
//! 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  5--我們可以看見,建立Mat矩陣/影象容器類的很多構造方法或者其他成員方法在建立Mat物件的時候,都
      需要指定type--所建立影象/矩陣的型別
  6--那麼型別是什麼呢?OpenCv的原始碼中說了一句:

  
  • 1
  • 2
  • 3
    (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)

  
  • 1
  • 2

  7--同樣,我們通過轉到定義法,看一下CV_8UC1,CV_64FC3等這些巨集到底是什麼,OpenCv的原始碼顯示
       如下(原始碼在在types_c.h中):

  
  • 1
  • 2
#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))
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

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

  
  • 1
    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通道影象

  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

  
  • 1
//【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)
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(二)Mat矩陣影象容器類建立Mat類物件常用的幾種方法:

1)使用Mat矩陣影象容器類的建構函式建立Mat類物件

  
  • 1
    //【1】載入原始影象1.jpg
    Mat srcImg=imread("1.jpg",1);
    //【2】建立一個和原始影象srcImg高和寬一致的8位無符號單通道的灰度圖片容器,並且初始化圖片為白色255
    Mat grayImg(srcImg.rows,srcImg.cols,CV_8UC1,Scalar(255));
  
  • 1
  • 2
  • 3
  • 4
2)為已經存在的IplImage指標建立資訊頭

  
  • 1
    //【1】宣告IplImg指標
    IplImg* imgTopDown; 
    //【2】將圖片載入到記憶體中
    imgTopDown=cvLoadImage("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    //【3】為已經存在的imgTopDown指標建立資訊頭
    //【4】轉換IplImage*--->Mat
    Mat mtx(imgTopDown);
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3)利用Create()函式建立Mat矩陣影象容器類的物件

  
  • 1
    //【1】載入原始影象1.jpg
    Mat srcImg=imread("1.jpg",1);
    //【2】建立一個和原始影象srcImg高和寬一致的8位無符號單通道的灰度圖片容器,並且初始化圖片為白色255
    Mat dstImg.create(srcImg.rows,srcImg.cols,CV_8UC1);
  
  • 1
  • 2
  • 3
  • 4
4)使用Matlab風格的函式建立Mat矩陣圖形容器類的物件

  
  • 1
    //! 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);
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

轉載自:https://blog.csdn.net/maweifei/article/details/51221259