minMaxLoc数据类型



我被这个问题难住了很长一段时间。你能帮我知道,minMaxLoc()在Opencv中考虑什么数据类型,同时找到Mat变量的最大值,最小值?我从函数中得到一个特定的值,但我不知道这个值实际代表什么,以及用什么数据类型?

    Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
    minMaxLoc(dst,&min,&estimate,&minLoc,&maxLoc,noArray());

'estimate'的值在1000左右,而如果我试图访问'dst' Mat变量的值,使用

    dst.at<datatype>(k,l)

我得到模糊的值,从124,125 (uchar)开始,到2,xxx,xxx,xxx(如果我使用long int)。minMaxLoc函数实际给出的值是什么?

min和estimate应该是double类型,我想它们是正确的。问题可能与您访问

有关。
dst.at<datatype>(k,l)

正如Abhishek Thakur所提到的,输出取决于你的输入。如果你对矩阵的类型感到困惑,你可以看看dst.type(),它返回一个整数,对应于从第557行开始的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()

Hammer的回答非常清楚,它向您展示了一个很好的提示:始终检查数据类型并注意types_c.h,每次需要时都要检查它!

无论如何,minMaxLoc返回双精度,但它已经为你做了强制转换。如果你给一个uchar Mat对象作为输入数组,它将设置两个双精度变量为0-255范围内的双精度(uchar范围!)。

请看下面的例子:

#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::拉普拉斯函数将返回一个uchar Mat。

所以,一定要知道你在处理什么样的数据。如果您正在使用彩色图像,您最好使用Mat::at<Scalar>()

这取决于你想要什么值。对于灰度图像,如果您输入具有uchar数据类型的Mat,您将获得0到255之间的值。

相关内容

  • 没有找到相关文章

最新更新