opencv中的模板匹配

一、函数:matchTemplate

二、调用方式:void matchTemplate( InputArray image, InputArray templ,OutputArray result, int method );

三、参数说明:InputArray image :输入图像 InputArray templ:输入模板 OutputArray result 匹配结果矩阵 int method 匹配方式

匹配方式共有六种

a、平方差匹配 method=CV_TM_SQDIFF

这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大。

b、标准平方差匹配 method=CV_TM_SQDIFF_NORMED


这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.

c、标准相关匹配 method=CV_TM_CCORR_NORMED


这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.

d、标准相关匹配 method=CV_TM_CCORR_NORMED


e、相关匹配 method=CV_TM_CCOEFF


这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).

f、标准相关匹配 method=CV_TM_CCOEFF_NORMED


通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价). 最好的办

法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案.

四、参考案例

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
cv::Mat image = imread("D:\\test.png", cv::IMREAD_COLOR);
cv::Mat templateImage = imread("D:\\template.png", cv::IMREAD_COLOR);
int result_cols = image.cols - templateImage.cols + 1;
int result_rows = image.rows - templateImage.rows + 1;

cv::Mat result = cv::Mat(result_cols, result_rows, CV_32FC1);
cv::matchTemplate(image, templateImage, result, CV_TM_SQDIFF);

double minVal, maxVal;
cv::Point minLoc, maxLoc, matchLoc;
cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
matchLoc = minLoc;

cv::rectangle(image, cv::Rect(matchLoc, cv::Size(templateImage.cols, templateImage.rows)), Scalar(0, 0, 255), 2, 8, 0);
imshow("", image);
}

五、结果及分析

结果从图中可以看出找到了模板在图像中的位置。opencv中的模板匹配的原理是将模板在图像中从左往右从上往下移动来计算匹配结果,

并将匹配结果存在矩阵中,这个矩阵的长宽正好等于图像的长宽减去模板长宽后加一。匹配完后用minMaxLoc()函数求这个矩阵中的最

大值和最小值来找到匹配的位置。





六、不足

opencv中的模板匹配中的模板和图像必须是一致(不能有旋转、缩放等变换),而商用软件halcon中的模板匹配可以匹配模板和图像之间有

旋转角的的情况,这严重限制了在机器视觉方面的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值