Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()

目录

1--模板匹配

1-1--OpenCV API

1-2--六种匹配方法

1-3--代码实例

2--最值计算

2-1--OpenCV API


1--模板匹配

        使用模板图像与原图像进行匹配,OpenCV提供了相应的模板匹配函数cv::matchTemplate(),并支持六种模板匹配方法。

1-1--OpenCV API

void cv::matchTemplate(cv::InputArray image, cv::InputArray templ, cv::OutputArray result, int method, cv::InputArray mask = noArray())

// cv::InputArray image:原图像
// cv::InputArray templ:模板图像
// cv::OutputArray result:匹配结果图
// int method:使用的方法
// cv::InputArray mask = noArray():输入的掩码图像,一般为空

1-2--六种匹配方法

① cv::TemplateMatchModes::TM_SQDIFF;

② cv::TemplateMatchModes::TM_SQDIFF_NORMED;

③ cv::TemplateMatchModes::TM_CCORR;

④ cv::TemplateMatchModes::TM_CCORR_NORMED;

⑤ cv::TemplateMatchModes::TM_CCOEFF;

⑥ cv::TemplateMatchModes::TM_CCOEFF_NORMED;

具体公式讲解可参考博客1

1-3--代码实例

# include <opencv2/opencv.hpp>
# include <cstdio>
# include <iostream>

cv::Mat src1, src2, dst;
int Method = cv::TemplateMatchModes::TM_SQDIFF;
int Max_track = 5;
void Match_Demo(int, void*){
    // 初始化结果图
    int width = src1.cols - src2.cols + 1;
    int height = src1.rows - src2.rows + 1;
    cv::Mat result(width, height, CV_32FC1);

    // 匹配
    cv::matchTemplate(src1, src2, result, Method, cv::Mat());
    cv::normalize(result, result, 1, 0, cv::NORM_MINMAX, -1, cv::Mat());

    cv::Point minLoc, maxLoc;
    double min, max;
    cv::Point temLoc;
    cv::minMaxLoc(result, &min, &max, &minLoc, &maxLoc, cv::Mat()); 
    // 根据匹配结果确定最佳的位置,不同的方法对应的最佳位置不同,例如 TM_SQDIFF 像素值最小(黑色)的地方对应最佳的位置
    if (Method == cv::TemplateMatchModes::TM_SQDIFF || Method == cv::TemplateMatchModes::TM_SQDIFF_NORMED){
        temLoc = minLoc;
    }
    else{
        temLoc = maxLoc;
    }

    // 绘制矩形
    src1.copyTo(dst);
    cv::rectangle(dst, cv::Rect(temLoc.x, temLoc.y, src2.cols, src2.rows), cv::Scalar(0, 0, 255), 2, 8);
    cv::rectangle(result, cv::Rect(temLoc.x, temLoc.y, src2.cols, src2.rows), cv::Scalar(0, 0, 255), 2, 8);
    cv::imshow("output", result);
    cv::imshow("match", dst);
}


int main(int argc, char** argv){
    
    src1 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg"); // 待检测图片
    src2 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/match.jpg"); // 模板图片

    if (src1.empty() || src2.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input1", src1);
    cv::imshow("input2", src2);

    cv::createTrackbar("Match Method: ", "input1", &Method, Max_track, Match_Demo);
    Match_Demo(0, 0);

    cv::waitKey(0);
    return 0;
}

2--最值计算

2-1--OpenCV API

void cv::minMaxLoc(cv::InputArray src, double *minVal, double *maxVal = (double *)0, cv::Point *minLoc = (cv::Point *)0, cv::Point *maxLoc = (cv::Point *)0, cv::InputArray mask = noArray())

// cv::InputArray src:输入数组
// double *minVal:最小值
// double *maxVal = (double *)0:最大值
// cv::Point *minLoc = (cv::Point *)0:最小值的位置
// cv::Point *maxLoc = (cv::Point *)0:最大值的位置
// cv::InputArray mask = noArray():输入的掩码,一般为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值