转载请注明出处。
文章地址:https://blog.csdn.net/duiwangxiaomi/article/details/97937706?spm=1001.2014.3001.5501
minMaxLoc()和minMaxIdx()函数的功能是一样的,两个函数的区别在于设置的参数不同,而且minMaxLoc()针对单通道图像,minMaxIdx()则不限制(不过输出的坐标会变成三维)。
函数功能
(1)计算矩阵Mat中最大值、最小值、返回最大最小的索引
(2)延伸一下,可以计算图像Mat中灰度最大值、最小值、返回最大最小的索引
函数原型
//! finds global minimum and maximum array elements and returns their values and their locations
CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, CV_OUT double* maxVal=0,
CV_OUT Point* minLoc=0,CV_OUT Point* maxLoc=0, InputArray mask=noArray());
//minMaxLoc()参数说明:
// src:输入矩阵Mat(图像)。
// minVal:最小值,可輸入NULL表示不需要。
// maxVal :最大值,可輸入NULL表示不需要。
// minLoc:最小值的位置,可输入NULL表示不需要,Point类型。
// maxLoc:最大值的位置,可输入NULL表示不需要,Point类型。
// mask:可有可无的掩模。
//! finds global minimum and maximum array elements and returns their values and their locations
CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal,
int* minIdx=0, int* maxIdx=0, InputArray mask=noArray());
// minMaxIdx()参数说明:
// src:输入矩阵Mat(图像)。
// minVal:最小值,可輸入NULL表示不需要。
// maxVal :最大值,可輸入NULL表示不需要。
// minIdx:最小值所在位置索引(i,j)
// maxIdx:最大值所在位置索引 (i,j)
// 【注】:minIdx和maxIdx的类型没有给出明确的说明和示例,需要将其定义为int型的含有两个数的数组,
// e.g. int idx_min[2] = {255,255}, idx_max[2]= {255, 255};,这是因为OpenCV中数组至少是二维的,
// 即使是一行或者一列的数组它们的点的坐标也应该有两个值。
// mask:可有可无的掩模。
说明: 参数若不需要,则置为NULL或者0,即可.
函数实现:
1.minMaxLoc()
int main()
{
#pragma region min_max
float data[2][3] = { { 4.0,1.0,3.0 },{ 8.0,7.0,9.0 } };
Mat src(2, 3, CV_32FC1, data);
float val = 0.0;
for (int j = 0; j < 2; j++)//row
{
for (int i = 0; i < 3; i++)//col
{
val = src.ptr<float>(j)[i];
cout << "(i,j) = " << i << "," << j << "\t" << val << endl;
}
}
//double minv, maxv;
//int idx_max[2], idx_min[2];
//minMaxIdx(src, &minv, &maxv, idx_min,idx_max);
//cout << "minv = " << minv << endl;
//cout << "idx_min = " << idx_min[0] << "," << "\t" << idx_min[1] << endl;
//cout << "maxv = " << maxv << endl;
//cout << "idx_max = " << idx_max[0] << "," << "\t" << idx_max[1] << endl;
double minv, maxv;
Point pt_min, pt_max;
minMaxLoc(src, &minv, &maxv, &pt_min, &pt_max);
cout << "minv = " << minv << endl;
cout << "idx_min = " << pt_min << endl;
cout << "maxv = " << maxv << endl;
cout << "idx_max = " << pt_max << endl;
#pragma endregion
return 0;
}
2.minMaxIdx()
int main()
{
#pragma region min_max
float data[2][3] = { { 4.0,1.0,3.0 },{ 8.0,7.0,9.0 } };
Mat src(2, 3, CV_32FC1, data);
float val = 0.0;
for (int j = 0; j < 2; j++)//row
{
for (int i = 0; i < 3; i++)//col
{
val = src.ptr<float>(j)[i];
cout << "(i,j) = " << i << "," << j << "\t" << val << endl;
}
}
double minv, maxv;
int idx_max[2], idx_min[2];
minMaxIdx(src, &minv, &maxv, idx_min,idx_max);
cout << "minv = " << minv << endl;
cout << "idx_min = " << idx_min[0] << "," << "\t" << idx_min[1] << endl;
cout << "maxv = " << maxv << endl;
cout << "idx_max = " << idx_max[0] << "," << "\t" << idx_max[1] << endl;
#pragma endregion
return 0;
}