我有点混淆了OpenCV中Mat
对象的type()
方法。
如果我有以下几行:
mat = imread("C:\someimage.jpg");
type = mat.type();
和type = 16
。我如何找出垫子矩阵的类型?
我试图在它的手册或几本书中找到答案,但都是徒劳的。
发布于 2013-07-24 04:40:39
下面是一个方便的函数,您可以使用它在运行时帮助识别opencv矩阵。至少,我发现它对调试很有用。
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
类型的变量,你可以这样调用它:
string ty = type2str( M.type() );
printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );
将输出数据,例如:
Matrix: 8UC3 640x480
Matrix: 64FC1 3x2
值得注意的是,还有矩阵方法Mat::depth()
和Mat::channels()
。这个函数只是从这两个位都存储在同一个值中的值的组合中获得人类可读的解释的一种方便方法。
发布于 2017-04-05 03:07:24
出于调试的目的,我在@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;
}
发布于 2017-08-16 03:21:10
这个问题得到了其他一些人的回答,但我找到了一个非常适合我的解决方案。
System.out.println(CvType.typeToString(yourMat.type()));
https://stackoverflow.com/questions/10167534
复制相似问题