首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在OpenCV中使用Mat:: type ()找出Mat对象的类型

如何在OpenCV中使用Mat:: type ()找出Mat对象的类型
EN

Stack Overflow用户
提问于 2012-04-16 08:51:21
回答 4查看 177.6K关注 0票数 142

我有点混淆了OpenCV中Mat对象的type()方法。

如果我有以下几行:

代码语言:javascript
复制
mat = imread("C:\someimage.jpg");
type = mat.type();

type = 16。我如何找出垫子矩阵的类型?

我试图在它的手册或几本书中找到答案,但都是徒劳的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-24 04:40:39

下面是一个方便的函数,您可以使用它在运行时帮助识别opencv矩阵。至少,我发现它对调试很有用。

代码语言:javascript
复制
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是一个Mat类型的变量,你可以这样调用它:

代码语言:javascript
复制
string ty =  type2str( M.type() );
printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );

将输出数据,例如:

代码语言:javascript
复制
Matrix: 8UC3 640x480 
Matrix: 64FC1 3x2 

值得注意的是,还有矩阵方法Mat::depth()Mat::channels()。这个函数只是从这两个位都存储在同一个值中的值的组合中获得人类可读的解释的一种方便方法。

票数 238
EN

Stack Overflow用户

发布于 2017-04-05 03:07:24

出于调试的目的,我在@Octopus的答案中为函数添加了一些可用性。

代码语言:javascript
复制
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;
    
}
票数 14
EN

Stack Overflow用户

发布于 2017-08-16 03:21:10

这个问题得到了其他一些人的回答,但我找到了一个非常适合我的解决方案。

代码语言:javascript
复制
System.out.println(CvType.typeToString(yourMat.type()));
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10167534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档