Mat::type()
查看opencv文檔對Depth的說明是單獨一個通道的類型,通俗的說就是圖像中單獨一個元素的類型,它可以有以下的類型:
#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
說明:
- CV_ opencv前綴
- 8,16… 代表每個像素所佔的位數
- S,U… 代表每個像素值得類型
Mat::type()
Type實際上是將Depth和通道個數混合在一起的一個類型,所以它的種類比較多,如下:
#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))
說明:
- CV_8U 對應depth
- C1 後面數字代表通道數
二者的關聯
depth是單通道像素點的屬性
type 是多通道像素點的屬性
type是type組成的一個數組,如果是單通道時,二者的值相等
代碼驗證:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <iostream>
int main()
{
Mat src = imread("d:/images/1.jpg");
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
namedWindow(src_win);
imshow(src_win, src);
cout <<"type:" <<hsv.type() << endl;
cout <<"depth:"<< hsv.depth() << endl;
cout <<"CV_8UC3 :"<<CV_8UC3 << endl;
waitKey(0);
return 0;
}
輸出結果:
type:16
depth:0
CV_8UC3 :16
因爲HSV是三通道的圖像,所以type其實就是對應的CV_8UC3
我們把圖像轉化成灰度,查看結果:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <iostream>
int main()
{
Mat src = imread("d:/images/1.jpg");
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
namedWindow(src_win);
imshow(src_win, src);
cout <<"type:" <<hsv.type() << endl;
cout <<"depth:"<< hsv.depth() << endl;
waitKey(0);
return 0;
}
輸出結果:
type:0
depth:0
兩者的值相等
使用場景
只有在單通道時我們纔可以在Mat::create中第二個參數傳入depth