opencv 中自带的模板匹配算法出处

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 中自带的模板匹配算法出处相关的知识,希望对你有一定的参考价值。

最近在看opencv 中自带的模板匹配算法,求告知“相关匹配 method=CV_TM_CCORR”、“标准相关匹配 method=CV_TM_CCORR_NORMED”的论文出处。

参考技术A 方法如下:
使用OPENCV下SIFT库做图像匹配的例程
// opencv_empty_proj.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])

const char* imagename = "img.jpg";

//从文件中读入图像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");

//如果读入图像失败
if(img.empty())

fprintf(stderr, "Can not load image %s\n", imagename);
return -1;

if(img2.empty())

fprintf(stderr, "Can not load image %s\n", imagename);
return -1;

//显示图像
imshow("image before", img);
imshow("image2 before",img2);
//sift特征检测
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)

cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;

siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;


  
参考技术B

1984.A Goshtasby et al."A Two-Stage Cross Correlation Approach to Template Matching"

2001.K Briechle, UD Hanebeck"Template Matching using Fast Normalized Cross Correlation"

论文电子版在附件里。

本回答被提问者采纳

OpenCV:快速模板匹配算法

【中文标题】OpenCV:快速模板匹配算法【英文标题】:OpenCV : Fast Template matching algorithm 【发布时间】:2015-11-18 16:09:39 【问题描述】:

我目前正在尝试在视频中查找图像。主要目标是跟随视频上的一些动作,例如按下按钮或屏幕上显示的弹出窗口。

我正在使用的代码使用 OpenCV 模板匹配功能:

    // For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
    if( matchingMethod  == CV_TM_SQDIFF || matchingMethod == CV_TM_SQDIFF_NORMED )
        matchLoc = minLoc;
    else
        matchLoc = maxLoc;

    if( !((matchLoc.x == 0) && (matchLoc.y == 0)) || maxVal >= 0.8)
        return TRUE;

    return FALSE;

测试是用这两个模板完成的:

并且完整的图像是 3840x2160 的图像(我不能只显示整个图像,因为它在 bmp 中太大了):

1) 问题是,对于两个像素差异很小的模板,算法怎么可能检测到第一个但完全跳过第二个? 2)颜色深度是否可能会导致检测问题?

两个模板都加载为 24 位深度的 BMP 文件。源图像转换为 24 位深度。 阈值设置为 0.92 以获得良好的准确性 MaxLevels 设置为 1 以获得非常好的准确性,因为 2 找不到任何匹配项

感谢您的帮助和建议

【问题讨论】:

【参考方案1】:

对于那些可能有同样问题的人,我只需要以不同的方式管理返回值。

代替

if( !((matchLoc.x == 0) && (matchLoc.y == 0)) || maxVal >= 0.8)
        return TRUE;

一旦找到潜在匹配(80% 匹配)就会返回 true。

现在只有当 maxVal 高于 0.99 时我才返回 true,这意味着非常匹配。

if( maxVal >= 0.99)
        return TRUE;

我更改的第二个元素是用于对像素值进行分类的阈值。我已将此值降低到 0.82 而不是 0.94 以获得更多可能的匹配,然后使用 maxVal 值进行过滤。

【讨论】:

以上是关于opencv 中自带的模板匹配算法出处的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenCV进行模板匹配(原图-模板图)

OpenCV:快速模板匹配算法

改进 OpenCV 的模板匹配算法

Python 机器视觉 - 基于opencv图像模板匹配实现的简单人脸匹配实例演示,matchTemplate的6大模板匹配算法

Python 机器视觉 - 基于opencv图像模板匹配实现的简单人脸匹配实例演示,matchTemplate的6大模板匹配算法

如何使用opencv实现图像匹配