Search code examples
opencvopencv-mat

How to find out what type of a Mat object is with Mat::type() in OpenCV?


I am kind of confused with type() method of Mat object in OpenCV.
If I have following lines:

mat = imread("C:\someimage.jpg");
type = mat.type();

and type = 16, how do I find out what type of mat matrix is?.
I tried to find the answer in its manual and in a couple of books in vain.


Solution

  • Here is a handy function you can use to help with identifying your opencv matrices at runtime. I find it useful for debugging, at least.

    string type2str(int type) {
      string r;
    
      uchar depth = type & CV_MAT_DEPTH_MASK;
      uchar chans = 1 + (type >> CV_CN_SHIFT);
    
      switch ( depth ) {
        case CV_8U:  r = "8U"; break;
        case CV_8S:  r = "8S"; break;
        case CV_16U: r = "16U"; break;
        case CV_16S: r = "16S"; break;
        case CV_32S: r = "32S"; break;
        case CV_32F: r = "32F"; break;
        case CV_64F: r = "64F"; break;
        default:     r = "User"; break;
      }
    
      r += "C";
      r += (chans+'0');
    
      return r;
    }
    

    If M is a var of type Mat you can call it like so:

    string ty =  type2str( M.type() );
    printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );
    

    Will output data such as:

    Matrix: 8UC3 640x480 
    Matrix: 64FC1 3x2 
    

    Its worth noting that there are also Matrix methods Mat::depth() and Mat::channels(). This function is just a handy way of getting a human readable interpretation from the combination of those two values whose bits are all stored in the same value.