我被这件事困扰了很长一段时间。你可以帮我知道,Opencv中minMaxLoc()的数据类型是什么,同时找到Mat变量的max,min值?我从函数中得到了一个值,但是我不知道这个值实际代表什么,以及在什么数据类型中?
Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
minMaxLoc(dst,&min,&estimate,&minLoc,&maxLoc,noArray());
'估计'的值大约在1000左右,而如果我尝试访问'dst'Mat变量的值,使用
dst.at<datatype>(k,l)
如果我使用long int,我会得到模糊的值,从124,125开始为uchar,到2,xxx,xxx,xxx。 minMaxLoc函数实际给出的值是多少?请帮帮我。
答案 0 :(得分:11)
min和估计应该是double类型,我认为它们是正确的。问题可能在于您访问
dst.at<datatype>(k,l)
正如Abhishek Thakur所说,输出取决于你的输入。如果您对矩阵的类型感到困惑,可以查看dst.type(),它返回一个整数,对应于从{55}行开始的types_c.h中定义的列表。单通道类型或“深度”的定义是
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
您可以在第573行看到用于计算其他类型标识符的公式
#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
例如
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
有类型
0+((4-1) << 3) == 24
因此,对于4通道uchar图像,type()将返回24.从上面可以看出,类型的深度由整数类型的最后3位表示。如果您想要的只是深度(您不关心它有多少个频道),您可以直接使用dst.depth()
答案 1 :(得分:3)
Hammer答案非常明确,它向您展示了一个很好的提示:始终检查数据类型并注意types_c.h
,每次都要查看它!
无论如何,minMaxLoc返回一个double,但它已经为你做了演员。如果你给一个uchar Mat对象作为输入数组,它会将2个双变量设置为0-255(uchar范围!)范围内的double。
见这个例子:
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int /*argc*/, char** /*argv*/) {
double m, M;
Point p_min, p_max;
Mat img;
// let's do with uchar Mat
img = (Mat_<uchar>(3,3) << 0,1,2,3,4,5,6,7,255);
cout << img << endl;
minMaxLoc(img, &m, &M, &p_min, &p_max);
cout << "min: " << m << " at " << p_min << endl;
cout << "max: " << M << " at " << p_max << endl;
cout << (int)img.at<uchar>(p_max.y, p_max.x) << endl; // cast to int otherwise cout will print an ASCII (uchar)
// now with float Mat
img = (Mat_<float>(3,3) << 0.1f,1.2f,2,3000.2f,4,5,6,7,255);
cout << img << endl;
minMaxLoc(img, &m, &M, &p_min, &p_max);
cout << "min: " << m << " at " << p_min << endl;
cout << "max: " << M << " at " << p_max << endl;
cout << img.at<float>(p_max.y, p_max.x) << endl;
return 0;
}
现在,在您发布的代码中,您可以在ddepth
中定义目标类型。您可以将ddepth
指定为opencv常量数据类型,例如:
ddepth = CV_8UC1
在这种情况下,cv :: Laplacian将返回一个uchar Mat。
因此,要始终了解您处理的数据类型。如果您正在使用彩色图像,则最好使用Mat::at<Scalar>()
。
答案 2 :(得分:2)
这取决于你想要的价值。对于灰度图像,如果输入带有uchar数据类型的Mat,则将获得0到255之间的值。