使用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
答案 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;
}