matchTemplate函数原型
void cv::matchTemplate(InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask = noArray()
)
参数 | 含义 |
---|---|
image | 正在运行搜索的图像。 它必须是 8 位或 32 位浮点数。 |
templ | 搜索到的模板。 它必须不大于源图像并且具有相同的数据类型。 |
result | 比较结果图。 它必须是单通道 32 位浮点数。 如果 image 是 W×H 并且 templ 是 w×h ,那么结果是 (W−w+1)×(H−h+1) |
method | 指定比较方法的参数,请参见TemplateMatchModes |
mask | 搜索模板的掩码。 它必须与 templ 具有相同的数据类型和大小。 默认情况下未设置。 目前,仅支持 TM_SQDIFF 和 TM_CCOEFF_NORMED 方法。 |
enum cv::TemplateMatchModes枚举量
将模板与重叠的图像区域进行比较。
该函数在图像中滑动,使用指定的方法将大小为 w×h 的重叠块与 templ 进行比较,并将比较结果存储在 result 中。 以下是可用比较方法的公式(I 表示图像,T 是模板,R 是结果)。求和是在模板和/或图像块上完成的:x′=0…w−1,y′=0…h−1
函数完成比较后,可以使用minMaxLoc
函数以全局最小值(使用TM_SQDIFF
时)或最大值(使用TM_CCORR
或TM_CCOEFF
时)找到最佳匹配。 在彩色图像的情况下,分子中的模板总和和分母中的每个总和在所有通道上完成,并且每个通道使用单独的平均值。 即该函数可以获取一个颜色模板和一个彩色图像。 结果仍然是单通道图像,更易于分析。
normalize函数原型
void cv::normalize(InputArray src,
InputOutputArray dst,
double alpha = 1,
double beta = 0,
int norm_type = NORM_L2,
int dtype = -1,
InputArray mask = noArray()
)
参数 | 含义 |
---|---|
src | 输入数组 |
dst | 与 src 大小相同的输出数组 |
alpha | 在范围归一化的情况下,规范值或范围下限。 |
beta | 范围归一化情况下的范围上限;它不用于规范标准化。 |
norm_type | 归一化类型,见cv::NormTypes |
dtype | 当为负数时,输出数组的类型与 src 相同; 否则,它具有与 src 相同数量的通道和深度 =CV_MAT_DEPTH(dtype)。 |
mask | 可选操作掩码 |
规范化数组的范数或值范围。
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 | 用于选择子数组的可选掩码 |
查找数组中的全局最小值和最大值。
函数cv::minMaxLoc
查找最小和最大元素值及其位置。 在整个数组中搜索极值,如果 mask 不是空数组,则在指定的数组区域中搜索。
该功能不适用于多通道阵列。 如果您需要在所有通道中找到最小或最大元素,请先使用 Mat::reshape 将数组重新解释为单通道。 或者,您可以使用 extractImageCOI 或 mixChannels 或 split 提取特定通道。
Mat::create函数原型
void cv::Mat::create(int rows,
int cols,
int type
)
这是 Mat 的关键方法之一。 大多数产生数组的新型 OpenCV 函数和方法为每个输出数组调用此方法。
模板匹配例程
参考官方例程:samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
string srcPath = "./lena.jpg";
string templPath = "./lena-templ.jpg";
Mat result;
Mat img = imread(srcPath);
Mat templ = imread(templPath);
int resultCols = img.cols - templ.cols + 1; //col = W - w + 1
int resultRows = img.rows - templ.rows + 1; //row = H - h + 1
result.create(resultRows, resultCols, CV_32FC1);
int method = TM_CCORR_NORMED;
matchTemplate(img, templ, result, method);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
double minVal, maxVal;
Point minLoc, maxLoc;
Point matchLoc;
cout << "result_channel: " << result.channels() << endl;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
if (method == TM_SQDIFF || method == TM_SQDIFF_NORMED) {
matchLoc = minLoc;
}
else {
matchLoc = maxLoc;
}
rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(255, 0, 0), 2, 8, 0);
imshow("match-result", img);
waitKey(0);
return 0;
}
匹配结果