OpenCV求(图像)矩阵中最大值,最小值函数minMaxLoc() vs minMaxIdx()

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()

  1. int main()
  2. {
  3. #pragma region min_max
  4. float data[2][3] = { { 4.0,1.0,3.0 },{ 8.0,7.0,9.0 } };
  5. Mat src(2, 3, CV_32FC1, data);
  6. float val = 0.0;
  7. for (int j = 0; j < 2; j++)//row
  8. {
  9. for (int i = 0; i < 3; i++)//col
  10. {
  11. val = src.ptr<float>(j)[i];
  12. cout << "(i,j) = " << i << "," << j << "\t" << val << endl;
  13. }
  14. }
  15. //double minv, maxv;
  16. //int idx_max[2], idx_min[2];
  17. //minMaxIdx(src, &minv, &maxv, idx_min,idx_max);
  18. //cout << "minv = " << minv << endl;
  19. //cout << "idx_min = " << idx_min[0] << "," << "\t" << idx_min[1] << endl;
  20. //cout << "maxv = " << maxv << endl;
  21. //cout << "idx_max = " << idx_max[0] << "," << "\t" << idx_max[1] << endl;
  22. double minv, maxv;
  23. Point pt_min, pt_max;
  24. minMaxLoc(src, &minv, &maxv, &pt_min, &pt_max);
  25. cout << "minv = " << minv << endl;
  26. cout << "idx_min = " << pt_min << endl;
  27. cout << "maxv = " << maxv << endl;
  28. cout << "idx_max = " << pt_max << endl;
  29. #pragma endregion
  30. return 0;
  31. }

2.minMaxIdx()

  1. int main()
  2. {
  3. #pragma region min_max
  4. float data[2][3] = { { 4.0,1.0,3.0 },{ 8.0,7.0,9.0 } };
  5. Mat src(2, 3, CV_32FC1, data);
  6. float val = 0.0;
  7. for (int j = 0; j < 2; j++)//row
  8. {
  9. for (int i = 0; i < 3; i++)//col
  10. {
  11. val = src.ptr<float>(j)[i];
  12. cout << "(i,j) = " << i << "," << j << "\t" << val << endl;
  13. }
  14. }
  15. double minv, maxv;
  16. int idx_max[2], idx_min[2];
  17. minMaxIdx(src, &minv, &maxv, idx_min,idx_max);
  18. cout << "minv = " << minv << endl;
  19. cout << "idx_min = " << idx_min[0] << "," << "\t" << idx_min[1] << endl;
  20. cout << "maxv = " << maxv << endl;
  21. cout << "idx_max = " << idx_max[0] << "," << "\t" << idx_max[1] << endl;
  22. #pragma endregion
  23. return 0;
  24. }

注:文中程序部分复制自参考链接1。

参考链接1
参考链接2

发布了33 篇原创文章 · 获赞 31 · 访问量 8万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览