opencv学习_11 (模板匹配(包括单模板和多模板))

2023-05-16

模板匹配——在一幅图像中匹配与模板相似的单个或者多个目标

(1)目标匹配函数:

cvMatchTemplate( const CvArr* image, constCvArr* 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归一化相关系数匹配法

 

(2):接着就是要找最值以及最值对应的坐标

cvMinMaxLoc()寻找一个矩阵中最大最小值以及相应的坐标

cvMinMaxLoc( constCvArr* arr, double* min_val, double* max_val,

                          CvPoint* min_locCV_DEFAULT(NULL),

                          CvPoint* max_locCV_DEFAULT(NULL),

                          const CvArr* mask CV_DEFAULT(NULL) );

单目标匹配结果:

代码:

#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
int main()
{
	IplImage *src = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 0);
	IplImage *srcResult = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 3);  //用来显示
	IplImage *templat = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\template.png", 0);
	IplImage *result;
	if(!src || !templat)
	{
		cout << "打开图像失败"<< endl;
		return 0;
	}
	int srcW, srcH, templatW, templatH, resultH, resultW;
	srcW = src->width;
	srcH = src->height;
	templatW = templat->width;
	templatH = templat->height;
	if(srcW < templatW || srcH < templatH)
	{
		cout <<"模板不能比原图像小" << endl;
		return 0;
	}
	resultW = srcW - templatW + 1;
	resultH = srcH - templatH + 1;
	result = cvCreateImage(cvSize(resultW, resultH), 32, 1);    
	cvMatchTemplate(src, templat, result, CV_TM_SQDIFF);   
	double minValue, maxValue;
	CvPoint minLoc, maxLoc;
	cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);  
	cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));
	cvNamedWindow("srcResult", 0);
	cvNamedWindow("templat", 0);
	cvShowImage("srcResult", srcResult);
	cvShowImage("templat", templat);
	cvWaitKey(0);
	cvReleaseImage(&result);
	cvReleaseImage(&templat);
	cvReleaseImage(&srcResult);
	cvReleaseImage(&src);
	return 0;
}

(3)多目标匹配:

结果:

代码:

#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;

CvPoint getNextMinLoc(IplImage *result, CvPoint minLoc, int maxVaule, int templatW, int templatH)
{

	// 先将第一个最小值点附近两倍模板宽度和高度的都设置为最大值防止产生干扰
	int startX = minLoc.x - templatW;
	int startY = minLoc.y - templatH;
	int endX = minLoc.x + templatW;
	int endY = minLoc.y + templatH;
	if(startX < 0 || startY < 0)
	{
		startX = 0;
		startY = 0;
	}
	if(endX > result->width - 1 || endY > result->height - 1)
	{
		endX = result->width - 1;
		endY = result->height - 1;
	}
	int y, x;
	for(y = startY; y < endY; y++)
	{
		for(x = startX; x < endX; x++)
		{
			cvSetReal2D(result, y, x, maxVaule);
		}
	}
	// 然后得到下一个最小值并且返回
	double new_minVaule, new_maxValue;
	CvPoint new_minLoc, new_maxLoc;
	cvMinMaxLoc(result, &new_minVaule, &new_maxValue, &new_minLoc, &new_maxLoc);
	return new_minLoc;

}
int main()
{
	IplImage *src = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 0);
	IplImage *srcResult = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 3);  //用来显示
	IplImage *templat = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\template.png", 0);
	IplImage *result;  // 用来存放结果
	if(!src || !templat)
	{
		cout << "打开图片失败" << endl;
		return 0;
	}
	int srcW, srcH, templatW, templatH, resultH, resultW;
	srcW = src->width;
	srcH = src->height;
	templatW = templat->width;
	templatH = templat->height;
	if(srcW < templatW || srcH < templatH)
	{
		cout << "模板不能比原图小" << endl;
		return 0;
	}
	resultW = srcW - templatW + 1;
	resultH = srcH - templatH + 1;
	result = cvCreateImage(cvSize(resultW, resultH), 32, 1);    //  匹配方法计算的结果最小值为float
	cvMatchTemplate(src, templat, result, CV_TM_SQDIFF);   
	double minValue, maxValue;
	CvPoint minLoc, maxLoc;
	cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);  
	cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));
	CvPoint new_minLoc;

	// 计算下一个最小值
	new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);
	cvRectangle(srcResult, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));
	// 再下一个
	new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);
	cvRectangle(srcResult, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));
	cvNamedWindow("srcResult", 0);
	cvNamedWindow("templat", 0);
	cvShowImage("srcResult", srcResult);
	cvShowImage("templat", templat);
	cvWaitKey(0);
	cvReleaseImage(&result);
	cvReleaseImage(&templat);
	cvReleaseImage(&srcResult);
	cvReleaseImage(&src);
	return 0;
}


作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)  


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv学习_11 (模板匹配(包括单模板和多模板)) 的相关文章

  • 线刷rom时fastboot flash system system.img报错

    我在线刷Nexus9的谷歌官方系统时遇到如下报错 fastboot flash system system img Sending sparse 39 system 39 1 3 501966 KB FAILED Error reading
  • 北京科技大学通用学术英语Mooc作文 大一下(20级版)

    注 xff1a 所选用文章均来自20级学生 xff0c 不是范文 xff0c 仅供参考 xff0c 想拿高分的还是自行动笔为上 xff08 文章整体预估得分区间为85 95 xff09 大一下 U1 an introductory para
  • verilog 学号输入并滚动显示

    TOP module module top input clk100mhz input clr input s input key1 input key2 input key3 input key4 input 2 0 count1 out
  • 生产者消费者模型详解

    生产者消费者模型 文章目录 生产者消费者模型什么是生产者消费者模型基于BlockingQueue的生产者消费者模型单生产者单消费者模型多生产者多消费者模型 什么是生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合
  • Verilog 电子秤设计

    能跑就行系列 仅供参考 xff08 xff09 功能 单次计价 xff1a 输入物品的重量 单价 xff0c 显示物品的总价 xff08 61 重量 单价 xff09 累计计价 xff1a 第一次按下累计按键 xff0c 记住当前物品的总价
  • Verilog 四层电梯设计

    能跑就行系列 描述 xff1a 设计一个4层楼的电梯控制系统 xff0c 完成电梯向上或向下移动到被请求楼层 xff08 假设电梯每移动一层需要1秒 xff09 请求可来自每层楼的呼叫按钮 xff0c 也可来自电梯内的目的楼层选择 当电梯到
  • 北京科技大学 工科物理实验 大二上

    前言 本文由20级学生整理 xff0c 包括实验目的和仪器 实验原理 实验步骤三个部分 主要是想节约一下大家手机拍照扫描 语音输入或手打的时间 xff08 可能有些任课老师要求手写 xff0c 那就爱莫能助了 xff09 使用方法 点击 源
  • 北京科技大学 工科物理实验 大二下

    前言 本文由20级学生整理 xff0c 包括实验目的和仪器 实验原理 实验步骤三个部分 主要是想节约一下大家手机拍照扫描 语音输入或手打的时间 xff08 可能有些任课老师要求手写 xff0c 那就爱莫能助了 xff09 5 4 实验原理部
  • [操作系统]进程同步 Reader-Writer问题 共享缓冲区问题 面包师问题 吸烟者问题

    目录 1 Reader Writer问题 2 共享缓冲区问题 3 面包师问题 4 吸烟者问题 1 Reader Writer问题 多个Reader进程 xff0c 多个Writer进程 xff0c 共享文件F 允许多个Reader进程同时读
  • 北京科技大学 算法分析与设计 计蒜客

    北京科技大学 算法分析与设计 计蒜客平时作业及实验代码 2022年 xff08 仅供参考 xff09 目录 作业一 买房子 USACO Open08 农场周围的道路 国王的魔镜 作业二 蜗牛旅游 NOIP2001 求先序排列 作业三 二分查
  • [JavaScript] 优先队列

    JavaScript 实现优先队列 代码如下 xff1a class Heap constructor cmp 61 a b 61 gt a lt b this arr 61 new Array this cmp 61 a b 61 gt
  • BASH PS1 参数详解

    PS1 xff1a 提示符的设置 PS1 xff08 是数字1而不是字母l xff09 xff0c 每个版本bash的PS1变量内的特殊符号可能有些小的差异 xff0c 你可以先man bash 一下 下面是FC4环境下默认的特殊符号所代表
  • 个人面试经验分享

    九月 十月是收获的季节 xff0c 也是奔波的季节 我也不例外 xff0c 没有特殊的机遇 xff0c 也是经历了一次残酷的海选啊 xff0c 把我经历简单的分享给各位学弟学妹们 我数了一下大概面了六家公司 xff1a 阿里 xff0c 华
  • Row size too large (> 8126)的解决方法

    stackOverflow上的解决方法 首先进行第一步 如果是window系统的话就不是my cnf这个文件的了 xff08 linux才是这个问题 xff09 在window系统是在数据库的安装目录下找到 在后面加上 innodb fil
  • Error:java: 程序包org.apache.ibatis.annotations不存在

    今天配合前端小伙伴做的UI差不多了 xff0c 我也该完善我的后端代码了 xff1b 就在我是用Mybatis generator生成实体对象和mapper之后 xff0c 我启动项目 xff0c 报了一个这样的错误 xff1a Error
  • Mac配置Royal TSX

    破解版 xff1a 链接 https pan baidu com s 1jrX 0ZpXiXRTnYeeTtPzzw 密码 eyyy 一 Royal TSX 介绍 Royal TSX是一款功能非常强大适用于 Mac 的远程连接管理工具 兼容
  • 如何用firefox开发者工具查看元素

    一 浏览器自带工具查看元素 1 选中元素 xff0c 右击选择 Inspect Element 查看元素 2 选择更多 web developer Inspector选择查看器 xff0c 页面上移动鼠标 xff0c 选中元素高亮显示 二
  • Day 2 如何用Chrome开发者工具查看元素和如何获取默认xpath和CSS

    如何用Chrome开发者工具查看元素 方式一 打开更多工具 开发者工具 xff0c 调出开发者模式 xff08 窗口位置可选 xff09 xff0c 移动鼠标可高亮显示元素 方式二 高亮元素 xff0c 右击选中检查调出开发者工具 xff0
  • python字符串

    字符串 字符串格式使用方法更改字符串大小写字符串使用变量字符串使用空白符号strip方法删除字符串前后空白 字符串格式 python格式 xff1a 在python中 xff0c 用双引号或单引号括起来的就是字符串双引号中可以使用单引号 单
  • selenium(一)框架介绍及安装

    1 selenium框架详解 1 1 什么是selenium selenium是一个用于web应用程序测试的工具 xff0c 可以直接在浏览器中运行 xff0c 通过驱动浏览器代替人工完成兼容性测试和功能回归测试 xff0c 支持多浏览器

随机推荐