锤子的答案非常清楚,它向您展示了一个很好的提示:始终检查数据类型并注意types_c.h
,每次需要时都检查一下!
无论如何, minMaxLoc 返回一个 double 但它已经为你做了演员。如果您将 uchar Mat 对象作为输入数组,它将在 0-255 范围内(uchar 范围!)将 2 个双精度变量设置为双精度。
看这个例子:
#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>()
.