如何在OpenCV中findMat :: type()是什么types的Mat对象

我对OpenCV中的Mat对象的type()方法感到困惑。
如果我有以下几行:

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

type = 16 。 我如何找出什么types的垫子matrix是?
我试图在手册或几本书中find答案。

这是一个方便的函数,可以帮助您在运行时识别opencvmatrix。 至less我觉得它对debugging很有用。

 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; } 

如果M是一个Mattypes的Mat你可以这样调用它:

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

将输出数据如:

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

值得注意的是,还有Matrix方法Mat::depth()Mat::channels() 。 这个函数只是从这两个值的组合中得到一个人类可读的解释的方便方式,这两个值的位全部存储在相同的值中。

出于debugging的目的,如果你想在debugging器中查找原始的Mat :: type:

 +--------+----+----+----+----+------+------+------+------+ | | C1 | C2 | C3 | C4 | C(5) | C(6) | C(7) | C(8) | +--------+----+----+----+----+------+------+------+------+ | CV_8U | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 | | CV_8S | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 | | CV_16U | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 | | CV_16S | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 | | CV_32S | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 | | CV_32F | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 | | CV_64F | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 | +--------+----+----+----+----+------+------+------+------+ 

例如,如果type = 30,那么OpenCV数据types是CV_64FC4。 如果type = 50,那么OpenCV数据types是CV_16UC(7)。

在OpenCV头文件“ types_c.h ”中有一组生成这些头文件的定义,格式为CV_bits{U|S|F}C<number_of_channels>
因此,例如CV_8UC3意味着8位无符号字符,3个颜色通道 – 这些名称中的每一个都映射到该文件中的macros的任意整数。

编辑:请参阅“ types_c.h ”例如:

 #define CV_8UC3 CV_MAKETYPE(CV_8U,3) #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) eg. depth = CV_8U = 0 cn = 3 CV_CN_SHIFT = 3 CV_MAT_DEPTH(0) = 0 (((cn)-1) << CV_CN_SHIFT) = (3-1) << 3 = 2<<3 = 16 

所以CV_8UC3 = 16但你不应该使用这个数字,只要检查type() == CV_8UC3如果你需要知道什么types的内部OpenCVarrays是。
记住OpenCV会把jpeg转换成BGR(或者如果你传递'0'来imread就是imread ),所以它不会告诉你任何有关原始文件的信息。

我总是使用这个链接来查看type()得到的数字是什么types:
OPENCV中的MATtypes列表
我希望这可以帮助你。

为了进行debugging,我在@Octopus的答案中添加了一些可用性。

 void MatType( Mat inputMat ) { int inttype = inputMat.type(); string r, a; uchar depth = inttype & CV_MAT_DEPTH_MASK; uchar chans = 1 + (inttype >> CV_CN_SHIFT); switch ( depth ) { case CV_8U: r = "8U"; a = "Mat.at<uchar>(y,x)"; break; case CV_8S: r = "8S"; a = "Mat.at<schar>(y,x)"; break; case CV_16U: r = "16U"; a = "Mat.at<ushort>(y,x)"; break; case CV_16S: r = "16S"; a = "Mat.at<short>(y,x)"; break; case CV_32S: r = "32S"; a = "Mat.at<int>(y,x)"; break; case CV_32F: r = "32F"; a = "Mat.at<float>(y,x)"; break; case CV_64F: r = "64F"; a = "Mat.at<double>(y,x)"; break; default: r = "User"; a = "Mat.at<UKNOWN>(y,x)"; break; } r += "C"; r += (chans+'0'); cout << "Mat is of type " << r << " and should be accessed with " << a << endl; } 

这被其他几个人回答了,但是我发现了一个对我来说真的很好的解决scheme。

 System.out.println(CvType.typeToString(yourMat));