imgproc模块--模板匹配

1.目的
(1)使用openCV函数matchTemplate()在输入图像中搜索图像块
(2)使用openCV函数minMaxLoc()寻找数组中的最大或者最小值

2.原理
[1]模板匹配
给定一个图像块,搜索配对的图像块,当模板是矩形时候,并不一定所有的矩形块内容都是相关的,在这种情况下,可以利用掩码分离有用信息。

[2]工作原理
输入:原图像,模板
目标:寻找最高的匹配块
这里写图片描述

搜索:比较模板和原图像,通过滑动形式配对模板。
这里写图片描述

搜索过程是从左到右,从上到下,逐个像素像素遍历的过程,通过计算每一次滑动过程的配对效果的好坏确定最佳匹配模块,并将度量结果存储在结果矩阵R中。矩阵R中的每一个位置(x,y)包含了配对度量。
匹配结果

如上图所示,红色圆圈中的亮点区域表示匹配高的区域,黑色的矩形框框表示匹配区域,实际过程中,我们通过minMaxLoc函数在结果矩阵R中寻找最佳匹配。

PS:如果使用掩码,则需要输入原图像,模板,掩码。掩码的维度必须和模板一致,并且拥有CV_8U和CV_32F的深度以及和模板具有相同通道数。CV_8U的掩码必须是二进制值,CV_32F则是在[0,1]之间的小数,掩码和模板对应相乘,获得经过掩码操作的模板。现在只有CV_TM_SQDIFF和CV_TM_CCORR_NORMED支持掩码操作。

[3]配对方法
<1>method=CV_TM_SQDIFF:平方差匹配法
平方差匹配法

<2>method=CV_TM_SQDIFF_NORMED:归一化平方差匹配法
归一化平方差匹配法

<3>method=CV_TM_CCORR:相关匹配法
相关匹配法

<4>method=CV_TM_CCORR_NORMED:归一化相关匹配法
归一化相关匹配法

<5>method=CV_TM_CCOEFF:相关系数匹配法
相关系数匹配法

<6>method=CV_TM_CCOEFF_NORMED:归一化相关系数匹配法
归一化相关系数匹配法

3.部分代码解释
(1)minMaxLoc

    /*
    minMaxLoc参数解释
    result:输入数组
    minVal:数组最小值
    maxVal:数组最大值
    minLoc:数组最小值所在位置
    maxLoc:数组最大值所在位置
    Mat():掩码,没定义则为无掩码操作
    */
    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());

(2)matchTemplate

    matchTemplate参数解释
    img:输入图像
    templ:模板
    result:匹配结果,存储匹配过程中的度量值metric value
    type:匹配方法
    */
    matchTemplate(img, templ, result, type);

4.完整代码
(1)CommonInclude.h

#ifndef COMMON_INCLUDE
#define COMMON_INCLUDE
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
#endif

(2)Matching.cpp

#include"CommonInclude.h"

/*
配对方法0,1,2,3,4,5
*/
int type = 0;
int num_type = 5;
Mat img, templ, mask, result;
char windowResultName[] = "Matched";
char windowOriginName[] = "Origin";

void Matching(int, void*){
    Mat display_img = img.clone();
    /*
    matchTemplate参数解释
    img:输入图像
    templ:模板
    result:匹配结果,存储匹配过程中的度量值metric value
    type:匹配方法
    */
    matchTemplate(img, templ, result, type);
    //归一化
    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

    double minVal, maxVal;
    Point minLoc, maxLoc;
    Point matchLoc;
    //使用minMaxLoc函数确定数组的最值以及位置
    /*
    minMaxLoc参数解释
    result:输入数组
    minVal:数组最小值
    maxVal:数组最大值
    minLoc:数组最小值所在位置
    maxLoc:数组最大值所在位置
    Mat():掩码,没定义则为无掩码操作
    */
    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
    if( type == CV_TM_SQDIFF || type == CV_TM_SQDIFF_NORMED )
    {
        matchLoc = minLoc;
    }else{
        matchLoc = maxLoc;
    }
    //绘制匹配的区域
    rectangle(display_img, matchLoc, Point(matchLoc.x+templ.cols, matchLoc.y+templ.rows), Scalar(0,0,0), 2, 8);
    rectangle(result, matchLoc, Point(matchLoc.x+templ.cols, matchLoc.y+templ.rows), Scalar(0,0,0), 2, 8);
    imshow(windowOriginName, img);
    imshow(windowResultName,display_img);
    imshow("result", result);
}

int main(int argc, char**argv){
    if(argc<3){
        cout << "more parameters are required!!!" << endl;
        return(-1);
    }
    img = imread(argv[1]);
    templ = imread(argv[2]);
    //mask = imread(argv[3]);
    if(!img.data || !templ.data){
        cout << "error to read images!!!" << endl;
        return(-1);
    }
    namedWindow(windowResultName, CV_WINDOW_AUTOSIZE);
    const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
    createTrackbar(trackbar_label, windowResultName,&type, num_type, Matching);
    Matching(0,0);
    waitKey(0);
    return(0);
}

参考文献
1.http://docs.opencv.org/master/de/da9/tutorial_template_matching.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用ORB-GMS匹配算法,您需要先下载并安装ORB-GMS匹配算法的相关代码库,然后在OpenCV中调用相关的头文件。以下是使用OpenCV调用ORB-GMS匹配算法的头文件示例: ```cpp #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/features2d.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/calib3d.hpp> #include "ORBextractor.h" #include "GMSMatcher.h" using namespace cv; using namespace std; using namespace ORB_SLAM2; int main(int argc, char** argv) { // 读取图像 Mat img1 = imread("img1.jpg"); Mat img2 = imread("img2.jpg"); // 提取特征点和特征描述符 ORBextractor orb(500, 1.2, 8, 20, 7); vector<KeyPoint> kp1, kp2; Mat desc1, desc2; orb(img1, Mat(), kp1, desc1); orb(img2, Mat(), kp2, desc2); // GMS匹配 GMSMatcher gms(kp1, img1.size(), kp2, img2.size()); vector<DMatch> matches; gms.GetMatches(kp1, desc1, kp2, desc2, matches); // 绘制匹配结果 Mat img_matches; drawMatches(img1, kp1, img2, kp2, matches, img_matches); imshow("Matches", img_matches); waitKey(0); return 0; } ``` 在上面的示例代码中,我们首先使用ORBextractor类提取图像的特征点和特征描述符。然后,我们使用GMSMatcher类进行特征点匹配,并使用drawMatches函数绘制匹配结果。请注意,为了使用ORBextractor和GMSMatcher类,我们需要包含ORBextractor.h和GMSMatcher.h头文件。 ### 回答2: 要使用OpenCV调用ORB-GMS匹配算法,需要包含以下头文件: #include <opencv2/opencv.hpp> #include <opencv2/features2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/highgui.hpp> 首先,需要包含"opencv2/opencv.hpp"头文件来引入OpenCV的基本功能。 然后,需要包含"opencv2/features2d.hpp"头文件来使用特征点检测和描述子匹配的函数。这个头文件中包含了ORB特征点检测器和描述子提取器的相关类和函数。 接着,需要包含"opencv2/xfeatures2d/nonfree.hpp"头文件来使用现有的ORB特征点检测器和描述子提取器。 然后,需要包含"opencv2/xfeatures2d.hpp"头文件来引入OpenCV的扩展特征点检测和描述子提取器。 最后,需要包含"opencv2/highgui.hpp"头文件来使用OpenCV的图像显示和调试函数。 通过包含这些头文件,我们就能够使用OpenCV提供的ORB-GMS匹配算法进行特征点匹配。 ### 回答3: 要调用OpenCV中的ORB-GMS匹配算法,你需要包含以下头文件: #include <opencv2/opencv.hpp> #include <opencv2/features2d.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> 其中,第一个头文件opencv2/opencv.hpp是引用整个OpenCV库的头文件,它包含了所有OpenCV的核心功能和数据结构。第二个头文件opencv2/features2d.hpp是引用ORB特征提取和描述符的头文件。第三个头文件opencv2/highgui.hpp是引用图形界面相关的头文件,用于显示图像和结果。第四个头文件opencv2/imgproc.hpp是引用图像处理相关的头文件,用于对图像进行处理和转换。 然后,你需要创建ORB特征提取器和描述符提取器对象: cv::Ptr<cv::ORB> orb = cv::ORB::create(); 接下来,将需要匹配的图像加载到内存中: cv::Mat image1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE); cv::Mat image2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE); 然后,使用ORB特征提取器提取关键点和描述符: std::vector<cv::KeyPoint> keypoints1, keypoints2; cv::Mat descriptors1, descriptors2; orb->detectAndCompute(image1, cv::noArray(), keypoints1, descriptors1); orb->detectAndCompute(image2, cv::noArray(), keypoints2, descriptors2); 接下来,使用GMS方法进行特征匹配: cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create(cv::DescriptorMatcher::GMS); std::vector<cv::DMatch> matches; matcher->match(descriptors1, descriptors2, matches); 最后,你可以绘制匹配结果并显示出来: cv::Mat result; cv::drawMatches(image1, keypoints1, image2, keypoints2, matches, result); cv::imshow("Matches", result); cv::waitKey(0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值