如何确定CvMat的数据类型

时间:2011-11-30 01:07:08

标签: c opencv

使用CvMat类型时,数据类型对于保持程序运行至关重要。

例如,根据您的数据类型是float还是unsigned char,您可以选择以下两个命令之一:

cvmGet(mat, row, col);
cvGetReal2D(mat, row, col);

对此有通用方法吗?如果将错误的数据类型矩阵传递给这些调用,它们将在运行时崩溃。这已成为一个问题,因为我定义的函数正在传递几种不同类型的矩阵。

如何确定矩阵的数据类型,以便始终可以访问其数据?

我尝试使用“type()”函数。

CvMat* tmp_ptr = cvCreateMat(t_height,t_width,CV_8U);
std::cout << "type = " << tmp_ptr->type() << std::endl;

这不编译,说"term does not evaluate to a function taking 0 arguments"。如果我删除单词type后面的括号,我会得到一个1111638032

的类型

编辑复制此内容的最小应用程序......

int main( int argc, char** argv )
{
    CvMat *tmp2 = cvCreateMat(10,10, CV_32FC1);
    std::cout << "tmp2 type = " << tmp2->type << " and CV_32FC1 = " << CV_32FC1 << " and " << (tmp2->type == CV_32FC1) << std::endl;
}

输出:tmp2 type = 1111638021 and CV_32FC1 = 5 and 0

4 个答案:

答案 0 :(得分:9)

type是变量,不是函数

CvMat* tmp_ptr = cvCreateMat(t_height,t_width,CV_8U);
std::cout << "type = " << tmp_ptr->type << std::endl;

修改

对于要打印的type的异常值according to this answer,此变量存储的内容多于数据类型。

因此,检查cvMat数据类型的适当方法是使用宏CV_MAT_TYPE()

CvMat *tmp2 = cvCreateMat(3,1, CV_32FC1);
std::cout << "tmp2 type = " << tmp2->type << " and CV_32FC1 = " << CV_32FC1 << " and " << (CV_MAT_TYPE(tmp2->type) == CV_32FC1) << std::endl;

数据类型的命名约定是:

CV_<bit_depth>(S|U|F)C<number_of_channels>

S = Signed integer
U = Unsigned integer
F = Float 

E.g.: CV_8UC1 means an 8-bit unsigned single-channel matrix, 
      CV_32FC2 means a 32-bit float matrix with two channels.

答案 1 :(得分:3)

有一个名为

的功能
CV_MAT_TYPE()

所以你可以做这样的事情

CV_MAT_TYPE(tmp2->type)

这将返回你需要的5,相当于CV_32FC1。

PO。我来找我用CV_MAT_TYPE得到的5的含义是什么,所以你给了我一个问题的答案。感谢。

答案 2 :(得分:0)

有许多type()函数可以返回数据类型,包括通道的大小和数量http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#cvmat

答案 3 :(得分:0)

虽然手头的问题与呼叫/访问&#39;类型&#39;有关。 Mat类的成员我相信opencv的ts模块中部署的CV_ENUM用法将为您提供更多信息。

该类型基本上是根据“深度”构建的。会员价值和渠道&#39;会员价值。通过在ts模块中使用MatDepth枚举,可以使用PrintTo方法。

如果您希望可以简单地通过屏蔽(&amp; -operator)位值并检查剩余位来从类型中提取通道数。

#include <opencv2/ts/ts_perf.hpp>
#include <iostream>

// Method for printing the information related to an image                                                                                                                                              
void printImageInfo(std::ostream * os, cv::Mat * image){
  int type = image->type();
  int channels = image->channels();
  cv::Size imageSize = image->size();
  perf::MatDepth depth(image->depth());
  *os << "Image information: " << imageSize << " type " << type
      << " channels " << channels << " ";
  *os << "depth " << depth << " (";
  depth.PrintTo(os);
  *os << ")" << std::endl;

}