opencv学习记录——(15)模板匹配

一、单模板匹配

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
void main()
{
	///单模板匹配
	Mat temp = imread("temp.png");  //模板图像
	Mat src = imread("src.png");  //待搜索图像即原图
	imshow("temp", temp);
	imshow("src", src);

	Mat dst = src.clone();  //原图备份:为后面可以在原图上画出绿色框做准备

	int width = src.cols -  temp.cols +1;  //result 宽度,因为像素点从0开始,所以要加1
	int height = src.rows - temp.rows +1; //result 高度

	Mat result(height, width, CV_32FC1); //创建结果映射图像即结果图

	matchTemplate(src, temp, result, CV_TM_CCOEFF_NORMED);  //化相关系数匹配最佳值 1
	imshow("result", result);
	normalize(result, result, 0, 1, NORM_MINMAX, -1);  //归一化到0--1范围
     
	double minValue, maxValue;//定义最小匹配值和最大匹配值
	Point minLoc, maxLoc;//定义最小匹配位置和最大匹配位置
	minMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);
	cout<<"minValue="<<minValue<<endl;//此处是为了看最小值和最大值 没有实际用处,不用写
	cout<<"maxValue="<<maxValue<<endl;

	rectangle(dst, maxLoc, Point(maxLoc.x+temp.cols, maxLoc.y+temp.rows), Scalar(0, 255, 0), 2, 8);//maxLoc代表后面画的矩形的左上角的坐标, maxLoc.x和maxLoc.y分别为该点的横坐标和纵坐标。temp.cols和temp.rows分别代表模板的长和宽。maxLoc.x+temp.cols和maxLoc.y+temp.rows分别代表矩形右下角坐标的横纵坐标。

	imshow("dst", dst);
waitKey(0);
//注释:如果是求宽度和长度等 例如上面的width要加1,如W-w+1,因为像素值从0开始计算;如果是求坐标,则直接加减即可例如:maxLoc.x+temp.cols
//最小值(minValue)、最大值(maxValue)、最小值位置(minLoc)、最大值位置(maxLoc)的解释:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值