OpenCV匹配


一、实现模板匹配matchTemplate()

原型

void matchTemplate(
	InputArray image,
	InputArray templ,
	OutputArray result,
	int method
)

参数

  • image:待搜素的图像。必须为8位或32位浮点型图像
  • templ:用于搜素的模板图像。需和待搜素的图像数据类型一样,且尺寸不能大于它。
  • result:比较结果的映射图像。必须为单通道、32位浮点型图像
  • method:匹配方法
    • TM_SQDIFF:平方差匹配法
    • TM_SQDIFF_NORMED:归一化
    • TM_CCORR:相关匹配法
    • TM_CCORR_NORMED:归一化相关匹配法
    • TM_CCOEFF:系数匹配法
    • TM_CCOEFF_NORMED:归一化系数匹配法

例子

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main()
{
	//灰度图
	Mat srcImage=imread("M.jpg",0);
	
	//取阈值成二值图
	srcImage=srcImage>180;

	//CLOSE
	Mat kernel=getStructuringElement(MORPH_RECT,Size(25,25));
	morphologyEx(srcImage,srcImage,MORPH_CLOSE,kernel);

	namedWindow("srcImage",WINDOW_NORMAL);
	imshow("srcImage",srcImage);
	
	Mat dstImage=Mat::zeros(srcImage.size(),srcImage.type());

	vector<vector<Point> > contours;
	vector<Vec4i> hierarchy;
	
	findContours(srcImage,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
	
	Scalar color(rand()&255,rand()&255,rand()&255);
	drawContours(dstImage,contours,-1,color,FILLED,8,hierarchy);

	vector<vector<Point> >::iterator It;
	
	Point vertex[4];
	int x1,y1,x2,y2;
	int keyworld=0;

    for(It = contours.begin();It < contours.end();It++)
	{
		//画出可包围数字的最小矩形
        Rect rect = boundingRect(*It);
        vertex[0] = rect.tl();
        //矩阵左上角的点
        vertex[1].x = rect.tl().x, vertex[1].y =rect.br().y;
        //矩阵左下方的点
        vertex[2] = rect.br();
        //矩阵右下角的点
        vertex[3].x = rect.br().x, vertex[3].y =rect.tl().y;
        //矩阵右上方的点
	
		for( int j = 0; j < 4; j++)
		{
			line(dstImage,vertex[j],vertex[(j+1)%4],Scalar(255,255,255),20);
		}

		if(keyworld==0)
		{
			x1=vertex[0].x;
			y1=vertex[0].y;
			x2=vertex[2].x;
			y2=vertex[2].y;
			keyworld=1;
		}
	}

	// namedWindow("dstImage",WINDOW_NORMAL);
	// imshow("dstImage",dstImage);


	srcImage=srcImage(Rect(x1,y1,x2-x1,y2-y1));
	namedWindow("srcImagePlus",WINDOW_NORMAL);
	imshow("srcImagePlus",srcImage);
	Mat templateImage=imread("NG/n0.jpg",0);
	int resultImageCols=srcImage.cols-templateImage.cols+1;
	int resultImageRows=srcImage.rows-templateImage.rows+1;
	Mat resultImage;
	resultImage.create(resultImageCols,resultImageRows,CV_32FC1);
	matchTemplate(srcImage,templateImage,resultImage,TM_SQDIFF);
	imshow("result",resultImage);
	waitKey();
	return 0;
}

二、minMaxLoc

原型

void minMaxLoc(
	InputArray 	src,
	double* minVal,
	double* maxVal=0,
	Point*  minLoc=0,
	Point*  maxLoc=0,
	InputArray mask=noArray() 
)

查找数组中的全局最小值和最大值。

函数cv :: minMaxLoc查找最小和最大元素值及其位置。在整个数组中搜索极值,或者如果掩码不是空数组,则在指定的数组区域中搜索极值。

该功能不适用于多通道阵列。如果需要在所有通道中找到最小或最大元素,请首先使用Mat :: reshape将数组重新解释为单通道。或者您可以使用extractImageCOI或mixChannels或split来提取特定通道。

参数

  • src:输入图像为单通道阵列。
  • minVal:指向返回的最小值的指针; 如果不需要,则使用NULL。
  • maxVal:指向返回的最大值的指针; 如果不需要,则使用NULL。
  • minLoc:指向返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。
  • maxLoc:指向返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL。
  • mask:用于选择子数组的可选掩码。

double minVal,maxVal;
Point minLoc,maxLoc;
minMaxLoc(srcIamge,&minVal,&maxVal,&minLoc,&maxLoc,Mat());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值