OpenCV计算机视觉开发实践:基于Qt C++ - 商品搜索 - 京东
这里的数组不是普通意义上的数组。核心模块Core专门提供了一些全局函数用于对数组(矩阵)进行操作。常用函数如表3-2所示。
3.2.1 寻找数组中最小值和最大值的位置(minMaxLoc)
全局函数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指向返回最小值的位置(2d情况下),如果传NULL,就表示不要求;maxLoc指向返回最小值的位置(2d情况下),如果传NULL,就表示不要求;mask用于指定下级矩阵的操作掩码。
【例3.13】计算单通道、多通道图像的最大值
(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); //3通道的图像
image.setTo(0);
image_3c.setTo(0);
image.at<uchar>(10, 200) = 255; //第10行、第200列处赋值255
image_3c.at<uchar>(10, 200) = 255; //第10行、第300列处赋值
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查找了单通道和多通道矩阵中的像素最大值。注意,多通道在使用minMaxLoc函数时不能给出其最大值和最小值坐标,因为每个像素点其实有多个坐标,所以无法给出。
(3)保存工程并运行,运行结果如图3-16所示。
图3-16