opencv计算两幅图像的重叠区域——模板匹配法

引言

使用常见的SIFT、SURF等基于特征的方法进行图像拼接,在特征匹配、以及图像配准环节只有图像重叠区域的特征点起作用,非重叠区域会造成大量的冗余,增加特征点提取、匹配过程的计算量。通过提取图像的重叠区域,只在重叠区域进行计算可以降低计算量,提高算法的效率。

可以通过模板匹配法或者相位相关法获取图像的重叠区域,本文将介绍模板匹配法,相位相关法后续也会介绍,代码语言为c++。

matchTemplate函数参数详解

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

该方法通过遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目

image

用于搜索的输入图像(原图), 8U 或 32F。

templ

用于匹配的模板(匹配图),和image类型相同

result

用于存储匹配之后的位置信息(结果),图像为单通道32F类型,图像的大小(W−w+1)×(H−h+1) 其中W、H分别为image的宽高,w、h为temple的宽和高

method

用于指定模板匹配的方法,opencv一共提供了六种模板匹配的方法。

enum  cv::TemplateMatchModes {
        cv::TM_SQDIFF = 0,
        cv::TM_SQDIFF_NORMED = 1,
        cv::TM_CCORR = 2,
        cv::TM_CCORR_NORMED = 3,
        cv::TM_CCOEFF = 4,
        cv::TM_CCOEFF_NORMED = 5
       }

mask 

模板的掩膜,和templ的类型相同,只有TM_SQDIFF 、 TM_CCORR_NORMED两种方法支持,默认为空(无掩膜)

使用实战

目的是在image图像中找到templ末班对应的区域

                                

                                 image                                                                               templ

代码

Mat src = imread("E:/imgStitch/images/s1.png", 1);//输入图像
Mat templ = imread("E:/imgStitch/images/t1.png", 1);//待匹配模板
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;
Mat ftmp;
//最后一个参数代表选用的方法
matchTemplate(src, templ, ftmp, 0);
normalize(ftmp, ftmp, 1, 0, NORM_MINMAX);
minMaxLoc(ftmp, &minVal, &maxVal, &minLoc, &maxLoc);
//选择不同的匹配方法,并根据不同的方法找到最佳匹配点,绘制模板区域
rectangle(src, Rect(minLoc.x, minLoc.y, templ.cols, templ.rows), 1, 8, 0);
//rectangle(src, Rect(maxLoc.x, maxLoc.y, templ.cols, templ.rows), 1, 8, 0);
imshow("result", src);

结果展示

本文仅展示TM_SQDIFF 、TM_SQDIFF_NORMED 两种方法,其余方法只需改动对应的输入参数,即method的参数,个方法的对应关系参考matchTemplate函数参数详解部分,根据自己的实验结果选取合适的方法。

TM_SQDIFF 

matchTemplate(src, templ, ftmp, 0);

                         

TM_SQDIFF_NORMED 

matchTemplate(src, templ, ftmp, 1);

                               

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值