Opencv处理图像--模板匹配(单目标)

Opencv处理图像--模板匹配(单目标)

模板匹配说白了就是在一幅图中找出和给出的模板图最相似的图并给他框选出来。

目标匹配函数:

cvMatchTemplate( const CvArr* image, const CvArr* templ,

                              CvArr* result, int method );

image

待搜索图像

templ

模板图像

result

匹配结果

method

计算匹配程度的方法

关于匹配方法,使用不同的方法产生的结果的意义可能不太一样,有些返回的值越大表示匹配程度越好,而有些方法返回的值越小表示匹配程度越好

关于参数 method:

CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法

通过cvMinMaxLoc获取最后的最佳匹配结果

代码:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
//这个函数用不着,是处理多目标的  
CvPoint getNextMinLoc(IplImage* result , int templatWidth,int templatHeight,double maxValIn , CvPoint lastLoc)
{

	int y,x;
	int startY,startX,endY,endX;

	//计算大矩形的左上角坐标
	startY = lastLoc.y - templatHeight;
	startX = lastLoc.x - templatWidth;

	//计算大矩形的右下角的坐标  大矩形的定义 可以看视频的演示
	endY = lastLoc.y + templatHeight;
	endX = lastLoc.x + templatWidth;

	//不允许矩形越界
	startY = startY < 0 ? 0 : startY;
	startX = startX < 0 ? 0 : startX;
	endY = endY > result->height-1 ? result->height-1 : endY;
	endX = endX > result->width - 1 ? result->width - 1 : endX; 

	//将大矩形内部 赋值为最大值 使得 以后找的最小值 不会位于该区域  避免找到重叠的目标
	for(y=startY;y<endY;y++)
	{
		for(x=startX;x<endX;x++)
		{
			cvSetReal2D(result,y,x,maxValIn);
		}
	}

	

	double minVal,maxVal;
	CvPoint minLoc,maxLoc;

	//查找result中的最小值 及其所在坐标
	cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);

	return minLoc;

}
//直接从这里看
int main(int argc, char* argv[])
{
	IplImage*src,*templat,*result,*show;
	int srcW,templatW,srcH,templatH,resultW,resultH;
	
	//加载源图像
	src = cvLoadImage("src.jpg" , CV_LOAD_IMAGE_GRAYSCALE);

	//用于显示结果
	show = cvLoadImage("src.jpg");

	//加载模板图像
	templat = cvLoadImage("template.png" , CV_LOAD_IMAGE_GRAYSCALE);

	if(!src || !templat)
	{
		printf("打开图片失败");
		return 0;
	}

	srcW = src->width;
	srcH = src->height;

	templatW = templat->width;
	templatH = templat->height;

	if(srcW<templatW || srcH<templatH)
	{
		printf("模板不能比原图大");
		return 0;
	}

	//计算结果矩阵的大小
	resultW = srcW - templatW + 1;
	resultH = srcH - templatH + 1;

	//创建存放结果的空间
	result = cvCreateImage(cvSize(resultW,resultH),32,1);

	double minVal,maxVal;
	CvPoint minLoc,maxLoc;

	//调用模板匹配函数
	cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);

	//查找最相似的值及其所在坐标
	cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);

	printf("minVal  %f   maxVal %f\n ",minVal,maxVal);

	//绘制结果 ;
	cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1);

	//显示结果
	cvNamedWindow("show");
	cvNamedWindow("tem");
	cvShowImage("show",show);
	cvShowImage("tem" , templat);
	cvWaitKey(0);

	
	return 0;
}

效果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV-Python提供了一系列用于图像处理和计算机视觉任务的功能,其中包括图像匹配图像匹配是指在一幅图像中寻找与目标图像相似的区域。通过OpenCV-Python,你可以使用模板匹配技术来实现图像匹配模板匹配是一种基于像素值相似度的匹配方法,它通过在输入图像中滑动一个模板图像,并计算模板与滑动窗口区域的相似度来找到最佳匹配位置。在OpenCV-Python中,你可以使用cv2.matchTemplate()函数来实现模板匹配。 下面是一个简图像匹配的例子代码: ```python import cv2 import numpy as np # 读取输入图像目标图像 input_img = cv2.imread('input_img.jpg') target_img = cv2.imread('target_img.jpg') # 将输入图像目标图像转换为灰度图像 input_gray = cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY) target_gray = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY) # 执行模板匹配 result = cv2.matchTemplate(input_gray, target_gray, cv2.TM_CCOEFF_NORMED) # 获取最佳匹配位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) top_left = max_loc # 获取目标图像的宽度和高度 target_width, target_height = target_gray.shape[::-1] # 绘制矩形框标记目标图像 cv2.rectangle(input_img, top_left, (top_left + target_width, top_left + target_height), (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Result', input_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先读取了输入图像目标图像,并将它们转换为灰度图像。然后,我们使用cv2.matchTemplate()函数执行模板匹配,并通过获取最佳匹配位置来找到目标图像在输入图像中的位置。最后,我们使用cv2.rectangle()函数在输入图像上绘制一个矩形框来标记目标图像的位置,并显示结果图像。 请注意,这只是一个简图像匹配示例,你可以根据自己的需求进行更复杂的图像匹配操作,例如使用不同的匹配方法、应用阈值、使用多个目标图像等。同时,确保你已经安装了OpenCV-Python库,并准备好了输入图像目标图像以供匹配使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码敌敌畏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值