opencv學習-Mat::type()和Mat::depth()的關係與區別

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章