基于OpenCV的图像匹配----模板匹配(⼀)
我先介绍⼀下模板匹配的原理
原图像:我们期望到与模板图像匹配的图像
模板图像:将于模板图像进⾏⽐较的图像
⼀次移动⼀个像素(从左到右,从上到下)。在每个位置,计算相似度度量,以便它表⽰在该位置处的匹配的“好”还是“坏”。下⾯直接⽤opencv进⾏实现
头⽂件
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
定义⼀些后⾯要⽤到的图像
Mat srcImage; //原图像
Mat templateImage;//模板图像
Mat resultImage; //输出结果
载⼊原图像和模板图像
srcImage = imread("map.png", 1);
templateImage = imread("img1.png", 1);
/*
Mat imread(const string& filename, int flags)
filename为⽂件路径
flags为读⼊类型,-1为解码得到的图像,0为单通道读⼊图像,即灰⽩图像,1为三通道读⼊图像,即彩⾊
图像
*/
初始化⽤于结果输出的矩阵
int resultImage_rows = ws - ws + 1;
int resultImage_cols = ls - ls + 1;
/*create(rows,cols,type)CV_32FC1为单通道图像,CV_32FC3为三通道图像*/
进⾏匹配和标准化
matchTemplate(srcImage, templateImage, resultImage, MatchMethod);
/*
void matchTemplate(InputArray image, InputArray temp, OutputArray result, int method)
image: 输⼊原图像
temp: 输⼊模板图像
result: 输出的相关系数矩阵
method: 匹配⽅法
平⽅差匹配法CV_TM_SQDIFF
归⼀化平⽅差匹配法CV_TM_SQDIFF_NORMED
相关匹配法CV_TM_CCORR
归⼀化相关匹配法CV_TM_CCORR_NORMED
相关系数匹配法CV_TM_CCOEFF
归⼀化相关系数匹配法CV_TM_CCOEFF_NORMED
*/
这五种匹配⽅法的公式分别是
normalize(resultImage, resultImage, 0, 1, NORM_MINMAX, -1, Mat());
/*
void normalize(const InputArray src, OutputArray dst, double alpha, double beta, int
normType, int rtype, InputArray mask)
src为输⼊数组
dst为输出数组
alpha为规范下限
beta为规范上限
normtype为公式类型
rtype为负数时,输出数组的type与输⼊数组的type相同;否则,输出数组与输⼊数组只是通道数相同
mask为掩膜,选择感兴趣区域,选定后只能对该区域进⾏操作。Mat()代表整幅图像
*/
通过函数 minMaxLoc 定位最匹配的位置
double minValue; double maxValue; Point minLocation; Point maxLocation;
/*定义最⼤值、最⼩值和最⼤值位置、最⼩值位置*/
Point matchLocation;
minMaxLoc(resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat());
/*
寻图像中最⼩值最⼤值及它们的位置
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0,
Point* maxLoc=0, InputArray mask=noArray())
src:输⼊图像。
minVal:最⼩值,可輸⼊NULL表⽰不需要。
maxVal :最⼤值,可輸⼊NULL表⽰不需要。
minLoc:最⼩值的位置,可输⼊NULL表⽰不需要,Point类型。
maxLoc:最⼤值的位置,可输⼊NULL表⽰不需要,Point类型。
mask:可有可⽆的掩模。
*/
对于⽅法 SQDIFF 和 SQDIFF_NORMED, 越⼩的数值有着更⾼的匹配结果. ⽽其余的⽅法, 数值越⼤匹配效果越好
if (MatchMethod == TM_SQDIFF || MatchMethod == TM_SQDIFF_NORMED)
{
matchLocation = minLocation;
}
else
{
matchLocation = maxLocation;
}
绘制出矩形,并显⽰最终结果
rectangle(tempImage, matchLocation, Point(matchLocation.x + ls, matchLocation.y + ws), Scalar(0, 0, 255), 2, 8, 0); /*
void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int
thickness=1, int line_type=8, int shift=0 );
img: 图像.
pt1: 矩形的⼀个顶点。
pt2: 矩形对⾓线上的另⼀个顶点
color: 线条颜⾊ (RGB) 或亮度(灰度图像)(grayscale image)。
thickness: 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了⾊彩的矩形。
line_type: 线条的类型。见cvLine的描述
shift: 坐标点的⼩数点位数。
*/
源代码的下载链接:
rectangle函数opencv如果没有积分的⼩伙伴也可以在评论⾥留下你的邮箱,我发给你。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论