1. 程式人生 > >OpenCV學習——Mat

OpenCV學習——Mat

Mat類在core.hpp中定義為:

class CV_EXPORTS Mat
{
public:

    。。。。。//各種方法

    enum { MAGIC_VAL=0x42FF0000, AUTO_STEP=0, CONTINUOUS_FLAG=CV_MAT_CONT_FLAG, SUBMATRIX_FLAG=CV_SUBMAT_FLAG };

    /*! includes several bit-fields:
         - the magic signature
         - continuity flag
         - depth
         - number of channels
     */
    int flags;
    //! the matrix dimensionality, >= 2
    int dims;
    //! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions
    int rows, cols;
    //! pointer to the data
    uchar* data;

    //! pointer to the reference counter;
    // when matrix points to user-allocated data, the pointer is NULL
    int* refcount;

    //! helper fields used in locateROI and adjustROI
    uchar* datastart;
    uchar* dataend;
    uchar* datalimit;

    //! custom allocator
    MatAllocator* allocator;

    。。。。//其他成員

};

Mat這個類有兩部分資料。一個是matrix header,這部分的大小是固定的,包含矩陣的大小,儲存的方式,矩陣儲存的地址等等。另一個部分是一個指向矩陣包含畫素值的指標

需要注意的是,copy這樣的操作只是copy了矩陣的matrix header和那個指標,而不是矩陣的本身,也就意味著兩個矩陣的資料指標指向的是同一個地址,需要開發者格外注意。比如上面這段程式,A、B、C指向的是同一塊資料,他們的header不同,但對於A的操作同樣也影響著B、C的結果。剛剛提高了記憶體自動釋放的問題,那麼當我不再使用A的時候就把記憶體釋放了,那時候再操作B和C豈不是很危險。不用擔心,OpenCV的大神為我們已經考慮了這個問題,是在最後一個Mat不再使用的時候才會釋放記憶體,咱們就放心用就行了。

如果想建立互不影響的Mat,是真正的複製操作,需要使用函式clone()或者copyTo()

說到資料的儲存,這一直就是一個值得關注的問題,Mat_<uchar>對應的是CV_8U,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。

流操作符<<對於Mat的操作,僅限於Mat是2維的情況。

Mat的儲存是逐行的儲存的。

再說說Mat的建立,方式有兩種,羅列一下:1.呼叫create(行,列,型別)2.Mat(行,列,型別(值))。