opencv template match
来源:互联网 发布:core java中文版下载 编辑:程序博客网 时间:2024/04/30 10:58
1. 什么是模板匹配?
模板匹配是一种用于在源图像S中寻找定位给定目标图像T(即模板图像)的技术。其原理很简单,就是通过一些相似度准则来衡量两个图像块之间的相似度Similarity(S,T)。
2. 用途
模板匹配方法常用于一些平面图像处理中,例如印刷中的数字、工业零器件等小尺寸目标图像识别分类。
3. 方法
模板匹配中,源图像和模板图像可以是二值图像、灰度图像、彩色图像。
一般而言,模板匹配有两种使用场景:
1)如果源图像S与模板图像T大小(高和宽)一致,则直接使用相似度计算公式对这两个图像进行相似度计算。
2)如果源图像S的size大于模板图像T,则在S中匹配T时,需要滑动匹配窗口(即模板图像的大小),计算模板图像与该窗口对应的图像区域之间的相似度。对整张S图像滑动完后,得到多个匹配结果。这里,有两种方式获取匹配结果。一种是返回所有匹配结果中的最佳匹配结果(最小值或最大值,依相似度计算方式而定)。另一种,是设定一个阈值,大于或小于该阈值的匹配结果都认为是有效的匹配。
例如,如图1所示,想要在大图中定位到小图(小狗的头部),使用模板匹配时的滑动过程如图2所示:
图1
(来源:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#template-matching)
图2
(来源:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#template-matching)
滑动完整张大图后,得到一张包含所有匹配结果的图,如图3所示。图3中的一个像素位置代表了一次模板匹配的结果。
4. 模板匹配中常用的相似度计算方法有:
1)Square difference matching method (method = CV_TM_SQDIFF) 平方差
4)上述三种方法的归一化形式(目的是为了减少光照的影响)
上述方法,OpenCV中都有实现。另外,除上述OpenCV实现了的方法外,还有一些相似度衡量方法,包括:
5)Sum of Absolute difference SAD 绝对差值
6)Match Pixel Count MPC 匹配成功点数
5. 模板匹配方法的优缺点:
优点:简单、直接
缺点:不具有旋转不变性、不具有尺度不变性
5. OpenCV中的模板匹配实例代码:
(代码来源:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#template-matching)
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace std;using namespace cv;/// 全局变量Mat img; Mat templ; Mat result;char* image_window = "Source Image";char* result_window = "Result window";int match_method;int max_Trackbar = 5;/// 函数声明void MatchingMethod( int, void* );int main( int argc, char** argv ){// 读图片img = imread( argv[1], 1 );templ = imread( argv[2], 1 );// 创建图像显示窗口namedWindow( image_window, CV_WINDOW_AUTOSIZE );namedWindow( result_window, CV_WINDOW_AUTOSIZE );// 创建混动条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, image_window, &match_method, max_Trackbar, MatchingMethod );MatchingMethod( 0, 0 );waitKey(0);return 0;}// 模板匹配void MatchingMethod( int, void* ){// 用于显示结果Mat img_display;img.copyTo( img_display );// 用于存储匹配结果的矩阵int result_cols = img.cols - templ.cols + 1;int result_rows = img.rows - templ.rows + 1;result.create( result_cols, result_rows, CV_32FC1 );// 进行模板匹配matchTemplate( img, templ, result, match_method );// 归一化结果(方便显示结果)normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );// 找到最佳匹配位置double minVal; double maxVal; Point minLoc; Point maxLoc;Point matchLoc;minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); // 寻找result中的最大和最小值,以及它们所处的像素位置// 使用SQDIFF和SQDIFF_NORMED方法时:值越小代表越相似// 使用其他方法时:值越大代表越相似if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ){matchLoc = minLoc; }else{ matchLoc = maxLoc; }// 显示匹配结果rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );imshow( image_window, img_display );imshow( result_window, result );}
-------------------------------------------------------
< 转载请注明:http://blog.csdn.net/icvpr>
- opencv template match
- template match
- 模板匹配(Match Template)
- 模板匹配(Match Template)
- 模板匹配(Match Template)
- 模板匹配(Match Template)
- 模板匹配(Match Template)
- xsl:template match的用法
- opencv sift match
- 模板匹配(Match Template) 修改版
- OpenCV+OpenCL stereo match 代码
- 【opencv】Template matching(模板匹配)
- Template Matching with OpenCV and C#
- OpenCV实现之模板匹配(Template Matching)
- Web显示层技术评估 -- 5.Scripted Template, 6, Template Manipulation, 7, Model Match, 8. 特性总表
- match
- match
- match
- PythonCard08
- SplashScreen While Loading
- Android:Layout_weight的深刻理解
- Linux串口编程简介
- PythonCardTricks
- opencv template match
- QuickSum
- Gtk and Win32 differences
- 【Android 开发】:Android五种布局的使用方法
- HDOJ-1238 Substrings!
- VIM 常用命令
- MapReduce:详解Shuffle过程
- 宏基4740g笔记本xp系统sata驱动安装
- 完美未来之星编程比赛 复赛第二场 发放激活码