OpenCV minMaxLoc()函数的用法(附带实例)
全局函数 minMaxLoc() 用于寻找数组中的最大值和最小值及其位置。该极值检测会遍历整个矩阵,当掩码为空时,遍历指定的特殊区域。
注意,minMaxLoc() 函数不适用于多通道阵列。如果需要在所有通道中查找最小元素或最大元素,首先使用 Mat::reshape() 将数组重新解释为单个通道,或者使用 extractImageCOI()、mixChannels() 或 split() 提取特定通道。
函数 minMaxLoc() 声明如下:
【实例】计算单通道、多通道图像的最大值。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
注意,minMaxLoc() 函数不适用于多通道阵列。如果需要在所有通道中查找最小元素或最大元素,首先使用 Mat::reshape() 将数组重新解释为单个通道,或者使用 extractImageCOI()、mixChannels() 或 split() 提取特定通道。
函数 minMaxLoc() 声明如下:
void cv::minMaxLoc (InputArray src, double * minVal, double * maxVal = 0, Point *minLoc = 0, Point * maxLoc = 0, InputArray mask = noArray() );参数说明如下:
- src:表示输入的单通道数组(矩阵);
- minVal:指向返回的最小值的指针,如果传入的是 NULL,就表示不要求最小值;
- maxVal:指向返回的最大值的指针,如果传入的是 NULL,就表示不要求最大值;
- minLoc:指向返回最小值的位置(二维情况下),如果传入的是 NULL,就表示不要求最小值的位置;
- maxLoc:指向返回最大值的位置(二维情况下),如果传入的是 NULL,就表示不要求最大值的位置;
- Mask:用于指定下级矩阵的操作掩码。
【实例】计算单通道、多通道图像的最大值。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
#include <QDebug> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; int main() { Mat image, image_3c; image.create(Size(256, 256), CV_8UC1); image_3c.create(Size(256, 256), CV_8UC3); // 三通道的图像 image.setTo(0); image_3c.setTo(0); image.at<uchar>(10, 200) = 255; // 第10行、第200列处赋值255 image_3c.at<uchar>(10, 200) = 255; // 第10行、第200列处赋值 double maxVal = 0; // 最大值一定要赋初值,否则运行时会报错 Point maxLoc; minMaxLoc(image, NULL, &maxVal, NULL, &maxLoc); qDebug() << "单通道图像最大值:" << maxVal; double min_3c, max_3c; minMaxLoc(image_3c, &min_3c, &max_3c, NULL, NULL); qDebug() << "3 通道图像最大值:" << max_3c; imshow("image", image); imshow("image_3c", image_3c); waitKey(0); return 0; }在上述代码中,我们利用全局函数 minMaxLoc() 查找了单通道和多通道矩阵中的像素最大值。
3) 保存工程并运行,结果如下:注意,多通道在使用 minMaxLoc() 函数时不能给出其最大值和最小值坐标,因为每个像素点有多个坐标,所以无法给出。
单通道图像最大值:255
3 通道图像最大值:255