基于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 = srcImage.rows - templateImage.rows + 1;
int resultImage_cols = srcImage.cols - templateImage.cols + 1;
resultImage.create(resultImage_rows, resultImage_cols, CV_32FC1);
/*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 + templateImage.cols, matchLocation.y + templateImage.rows), 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: 坐标点的小数点位数。
*/

源代码的下载链接:

https://download.csdn.net/download/weixin_42521239/11147622

如果没有积分的小伙伴也可以在评论里留下你的邮箱,我发给你。

LineMOD是一种快速的物体检测和识别方法,它使用基于模板匹配的技术来识别物体。OpenCV提供了一个LineMOD算法的实现,该算法可以用于Python中。 要使用opencv-contrib-python4.6.0的LineMOD进行模板匹配,你需要完成以下步骤: 1. 安装OpenCV库。你可以使用pip安装OpenCV库,命令如下: ``` pip install opencv-python-headless==4.5.3.56 opencv-contrib-python-headless==4.5.3.56 ``` 2. 获取模板图像。你需要准备要识别的物体的模板图像,并将其保存在本地。 3. 加载模板图像。使用OpenCV的imread函数加载模板图像,并将其转换为灰度图像。 ``` import cv2 template = cv2.imread('template.png', cv2.IMREAD_GRAYSCALE) ``` 4. 创建LineMOD检测器。使用cv2.linemod_Detector_create函数创建一个LineMOD检测器对象。你可以通过传递要使用的模板图像数量和阈值等参数来调整检测器的性能。 ``` num_modalities = 1 threshold = 50 detector = cv2.linemod_Detector_create(num_modalities, threshold) ``` 5. 添加模板图像。使用detector.addTemplate函数向检测器添加模板图像。你需要传递模板图像、模板图像ID和模板图像的尺寸等参数。 ``` template_id = 0 detector.addTemplate(template, template_id) ``` 6. 加载测试图像。你需要加载要在其中搜索物体的测试图像,并将其转换为灰度图像。 ``` test_image = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE) ``` 7. 进行物体检测。使用detector.match函数在测试图像中搜索物体,并返回检测到的物体位置和匹配度等信息。 ``` matches, scores, _ = detector.match(test_image, threshold) ``` matches包含了检测到的物体的位置和模板图像ID等信息,scores包含了每个检测结果的匹配度。你可以根据匹配度对检测结果进行排序,并选择匹配度最高的结果作为最终结果。 通过以上步骤,你可以使用opencv-contrib-python4.6.0的LineMOD进行模板匹配
评论 146
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值