OpenCV Mat數據存儲格式詳解

官方手冊:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/mat%20-%20the%20basic%20image%20container/mat%20-%20the%20basic%20image%20container.html#id2

http://blog.csdn.net/u013488563/article/details/19981887

(一)

Mat_<uchar>對應的是CV_8U,Mat_<char>對應的是CV_8S,Mat_<int>對應的是CV_32S,Mat_<float>對應的是CV_32F,Mat_<double>對應的是CV_64F,對應的數據深度如下:

• CV_8U - 8-bit unsigned integers ( 0..255 )

• CV_8S - 8-bit signed integers ( -128..127 )

• CV_16U - 16-bit unsigned integers ( 0..65535 )

• CV_16S - 16-bit signed integers ( -32768..32767 )

• CV_32S - 32-bit signed integers ( -2147483648..2147483647 )

• CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )

• CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

這裏還需要注意一個問題,很多OpenCV的函數支持的數據深度只有8位和32位的,所以要少使用CV_64F,但是vs的編譯器又會把float數據自動變成double型,有些不太爽。

還有個需要注意的問題,就是流操作符<<對於Mat的操作,僅限於Mat是2維的情況。

還有必要說一下Mat的存儲是逐行的存儲的。

(二)

http://3y.uu456.com/bp-8d22071f2afq0242a8qsessa-1.html

OpenCV中CvMat結構詳解及相關例子

一、CvMat結構詳解

CvMat的定義在OpenCV244\opencv\build\include\opencv2\core\types_c.h 文件中

因爲這裏我裝的OpenCV版本是2.4.4,不同的版本,相應的目錄可能不同,由其是對於OpenCV早期版本

對CvMat結構做一些說明:

typedef struct CvMat
{
int type; //標示元素類型和標記
int step; //以字節爲單位的行數據長度
/* for internal use only */
int* refcount;
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; //數據指針
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows; //行數(用於保存圖像數據時可以理解爲圖像高度)
int cols; //列數(用於保存圖像數據時可以理解爲圖像寬度)
#endif
}


1.CvMat中type的取值

CvMat中的type成員用於標示元素類型和標記,OpenCV中用一系列的宏定義了可取的元素值

可取以下值:

#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_8UC1爲例:

CV_ :OpenCV數據結構前綴

8UC1 :表示8位無符號字符型單通道矩陣

tips:

(1)、關於CvMat的通道數的理解:

可以理解爲CvMat的一個矩陣值中包含幾個數據,單通道即表示矩陣中的一個值中只有一個數據;

當用CvMat保存彩色圖像數據時,可以理解爲3通道矩陣,即矩陣中一個值包含R、G、B三個數據

(2)、當CvMat的數據類型爲CV_8UC1時,對於數據的訪問,需選擇CvMat.data.ptr指針

不同的數據類型,訪問元素時指針的選擇不同。

二、矩陣CvMat的兩種聲明和初始化方法

1、直接給CvMat賦值,逐點賦值

CvMat* mat = cvCreateMat( 2, 2, CV_64FC1 );

cvZero( mat );

cvmSet( mat, 0, 0, 1 );

cvmSet( mat, 0, 1, 2 );

cvmSet( mat, 1, 0, 3 );

cvmSet( mat, 2, 2, 4 );

cvReleaseMat( &mat );

2、利用現有數組,對CvMat賦值

double a[12] = { 1, 2, 3, 4,

5, 6, 7, 8,

9, 10, 11, 12 };

CvMat mat = cvMat( 3, 4, CV_64FC1, a );


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