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

Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()_第1张图片

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

Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()_第2张图片

Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()_第3张图片

1-3--代码实例

# include 
# include 
# include 

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

Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()_第4张图片

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():输入的掩码,一般为空

你可能感兴趣的:(Opencv(C++)学习笔记,c++,opencv,计算机视觉)