-
2021-07-23 20:17:52
使用Python,OpenCV进行模板匹配单对象、多对象及多尺度模板匹配
这篇博客将介绍如何使用模板匹配在图像中查找对象。模板匹配是一种在较大的图像中寻找模板图像位置的方法。OpenCV使用cv2.matchTemplate() 、cv2.minMaxLoc()实现模板匹配。
主要分为3部分:
- 模板匹配单对象
- 模板匹配多对象
- 多尺度模板匹配(本文是用的与原始图要检测的对象具有相同大小,尺寸的模板进行的匹配;这里可以优化,即模板图像放大缩小都可以被检测到,可参考:使用Python和OpenCV进行多尺度模板匹配)
1. 效果
更多相关内容 -
模板匹配分类器中匹配规则设计
2018-02-06 10:20:46在代码中主要写了两个函数,一个是计算两个样品的匹配程度 ,返回两各样品的的匹配程度。一个是利用最小距离法计算出测试样本最接近的样本 ,并返回它的数字类别和编号。 -
matlab做的模板匹配,简单有效
2019-10-23 17:21:35阈值分割后基于形状做的模板匹配,使用最大熵阈值分割法,效果优于otsu。 -
python+opencv实现图像模板匹配
2019-02-25 12:19:30通过使用opencv,使用python语言实现图像模板匹配,从而实现图像的类别分类。 -
彩色快速(CFAST)匹配:彩色图像的快速仿射模板匹配
2021-02-25 23:01:36快速匹配是一种快速有效的模板匹配算法。 但是,当匹配彩色图像时,图像将转换为灰度图像。 在此过程中,颜色信息会丢失,从而导致在具有独特颜色但灰度值相似的区域中出现错误。提出了一种改进的快速匹配算法,该... -
模板匹配字符识别C++.zip
2019-06-04 15:19:14里面包含不同的字符图片,通过模板匹配寻找特征值,进行字符分类。代码采用C++,运行环境:win7+VS2010. -
opencv 模板匹配
2021-07-11 15:19:14模板匹配意思就是找一副已经存在的图片,从其他图片中查找近似的图片,接下来我们准备两幅大图,一副小图 准备两幅大图,监控里面的截图并且时间不一样,角度也不一样 图片一 图片二 可以看出两幅图片是不一样的...我的其他文章
AKAZE 局部特征匹配
级联分类器使用
等比例缩放图片
给图片加logo
鱼眼校正
智能答卷识别
opencv滤镜效果
灰度图像增强方式更多文章正在写作过程中。
基础知识点
模板匹配意思就是找一副已经存在的图片,从其他图片中查找近似的图片,接下来我们准备两幅大图,一副小图
准备两幅大图,监控里面的截图并且时间不一样,角度也不一样
图片一
图片二
可以看出两幅图片是不一样的,由于摄像头角度偏摆,部分图片并不一样,角度也不一致show me the code
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h> using namespace std; using namespace cv; int main() { Mat img,img2, templ, result,result2; img = imread("./big.jpg"); img2 = imread("./big2.jpg"); templ = imread("./temp.jpg"); imshow("t1", templ); int result_cols = img.cols - templ.cols + 1; int result_rows = img.rows - templ.rows + 1; result.create(result_cols, result_rows, CV_32FC1); //matchTemplate(img, templ, result, TM_SQDIFF_NORMED);//这里我们使用的匹配算法是标准平方差匹配 method=CV_TM_SQDIFF_NORMED,数值越小匹配度越好 matchTemplate(img, templ, result, TM_CCOEFF_NORMED);//数值越小匹配度越好 matchTemplate(img2, templ, result2, TM_CCOEFF_NORMED);//数值越小匹配度越好 normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat()); normalize(result2, result2, 0, 1, NORM_MINMAX, -1, Mat()); double minVal = -1; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; //cout << "匹配度:" << minVal << endl; minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat()); cout << "匹配度 min:" << minVal<<" max:" <<maxVal<< endl; //matchLoc = minLoc; matchLoc = maxLoc; rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0); imshow("img", img); minMaxLoc(result2, &minVal, &maxVal, &minLoc, &maxLoc, Mat()); cout << "匹配度 min:" << minVal << " max:" << maxVal << endl; matchLoc = maxLoc; rectangle(img2, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0); imshow("img2", img2); waitKey(0); return 0; }
执行
结果如下:
从两幅图片中都找到了匹配。 -
【图像识别】基于模板匹配算法实现花朵分类matlab源码.md
2021-08-23 15:00:53【图像识别】基于模板匹配算法实现花朵分类matlab源码.md -
基于投影特征和模板匹配的车牌汉字识别算法 (2010年)
2021-05-20 16:03:18目前车牌汉字识别算法主要有特征分析算法和模板匹配算法,特征分析算法受图像质量的影响比较大,模板匹配算法在识别率方面达不到实际应用要求。本文提出了逐级识别算法:首先利用投影法进行匹配,把可识别的字符挑选出来... -
[python-opencv]模板匹配
2021-03-06 14:56:05模板匹配最适用于工业场合(在一张图片中识别特定的工件图)模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像(target)的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中...模板匹配最适用于工业场合(在一张图片中识别特定的工件图)
模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像(target)的什么地方,进而识别对象物,这就是一个匹配问题。
它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
简单来说,模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
工作原理:在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
1 importcv2 as cv2 importnumpy as np3
4
5 defmatchTemplate_demo():6 tpl = cv.imread('1_tpl.jpg')7 target = cv.imread('1.jpg')8 #cv.namedWindow('matchTemplate_demo', cv.WINDOW_AUTOSIZE)
9 #cv.imshow('matchTemplate_demo',tpl)
10 #cv.namedWindow('matchTemplate_demo', cv.WINDOW_AUTOSIZE)
11 cv.imshow('matchTemplate_demo', target)12 #定义3中标准匹配方法
13 methods =[cv.TM_SQDIFF_NORMED,cv.TM_CCORR_NORMED,cv.TM_CCOEFF_NORMED]14 tpl_h , tpl_w = tpl.shape[:2] #取模板图片的高 宽
15 for method inmethods:16 result =cv.matchTemplate(target,tpl,method)17 #返回的 minVal, maxVal (模板与目标图片像素匹配的最小值 最大值), minLoc, maxLoc(最小和最大位置)
18 #打印出minVal, maxVal, minLoc, maxLoc: 0.0004309755750000477 1.0 (466, 185) (395, 327)
19 minVal, maxVal, minLoc, maxLoc =cv.minMaxLoc(result)20 print(minVal, maxVal, minLoc, maxLoc)21 if method ==cv.TM_SQDIFF_NORMED:22 tl =minLoc23 else:24 tl =maxLoc25 #当时用第一种cv.TM_SQDIFF_NORMED匹配方法时:br是矩形左上角的坐标
26 #当时用第二种cv.TM_CCORR_NORMED第三种cv.TM_CCOEFF_NORMED匹配方法时:br是矩形左上角的坐标
27 print(tl)28 br = (tl[0]+tpl_w,tl[1]+tpl_h)29 #在target图片上绘制tl+br矩形,红色,线宽2
30 cv.rectangle(target,tl,br,(0,0,255),2)31 cv.namedWindow('match-'+np.str(method),cv.WINDOW_NORMAL)32 cv.imshow('match-'+np.str(method),target)33
34
35 matchTemplate_demo()36
37 cv.waitKey(0)38 cv.destroyAllWindows()
知识点:
1.几种常见的模板匹配算法:
其中,
①TM_SQDIFF是平方差匹配;TM_SQDIFF_NORMED是标准平方差匹配。利用平方差来进行匹配,最好匹配为0,匹配越差,匹配值越大。
②TM_CCORR是相关性匹配;TM_CCORR_NORMED是标准相关性匹配。采用模板和图像间的乘法操作,数越大表示匹配程度较高, 0表示最坏的匹配效果。
③TM_CCOEFF是相关性系数匹配;TM_CCOEFF_NORMED是标准相关性系数匹配。将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。
总结:随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。
参考:
注意:
参考的第一篇博客的关于模板匹配算法的原理模板图像应该是左上角开始,而不是从中心点开始。在左上角那个点开始计算匹配度,最后得出的最匹配的坐标点是模板图像左上角的位置。
2.opencv的目标匹配函数为matchTemplate,函数原型为:matchTemplate(image, templ, method[, result[, mask]]) -> result
image参数表示待搜索源图像(目标),必须是8位整数或32位浮点。
templ参数表示模板图像,必须不大于源图像并具有相同的数据类型。
method参数表示计算匹配程度的方法。
result参数表示匹配结果图像,必须是单通道32位浮点。如果image的尺寸为W x H,templ的尺寸为w x h,则result的尺寸为(W-w+1)x(H-h+1)。
3.opencv的函数minMaxLoc:在给定的矩阵中寻找最大和最小值,并给出它们的位置。 该功能不适用于多通道阵列。 如果您需要在所有通道中查找最小或最大元素,要先将阵列重新解释为单通道。
函数minMaxLoc原型为:minMaxLoc(src[, mask]) -> minVal, maxVal, minLoc, maxLoc
src参数 表示输入单通道图像。
mask参数 表示用于选择子数组的可选掩码。
minVal参数 表示返回的最小值,如果不需要,则使用NULL。
maxVal参数 表示返回的最大值,如果不需要,则使用NULL。
minLoc参数 表示返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。
maxLoc参数 表示返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL。
4.opencv的函数rectangle用于绘制矩形。函数原型为:rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img
img参数 表示源图像。
pt1参数 表示矩形的一个顶点。
pt2参数 表示与pt1相对的对角线上的另一个顶点 。
color参数 表示矩形线条颜色 (RGB) 或亮度(灰度图像 )。
thickness参数 表示组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
lineType参数 表示线条的类型。
shift参数 表示坐标点的小数点位数。
-
第二十一课: 模板匹配的基本概念--模板匹配的分类及注意事项
2019-09-16 09:25:40模板匹配主要分三种,基于形状,基于相关性,基于灰度,主要掌握基于形状的模板匹配。基于形状的模板匹配主要分为创建边缘模板(create_shape_model)、创建边缘轮廓模板(create_shape_model_xld)该模板的输入参数...---first_example_shape_matching.hdev
模板匹配主要分三种,基于形状,基于相关性,基于灰度,主要掌握基于形状的模板匹配。基于形状的模板匹配主要分为创建边缘模板(create_shape_model)、创建边缘轮廓模板(create_shape_model_xld)该模板的输入参数为轮廓,两种都和算子find_shape_model一起使用。创建具有缩放比的模板(create_scaled_shape_model)和算子find_scaled_shape_model一起使用
1、get_image_pointer1(Image : : : Pointer, Type, Width, Height)
返回指向图像的第一个通道的指针,根据输出类型并返回图像的宽和高
2、三种创建形状模板的算子
1)create_shape_model创建边缘模板
2)create_shape_model_xld创建边缘轮廓模板
Template ://参数为轮廓
: NumLevels,
3)create_scaled_shape_model创建具有缩放比的模板
Template : :
ScaleMin, //图像的最小比例
ScaleMax, //图像最大比列
ScaleStep, //一般设置为自动
ModelID) 创建可缩放的形状模板与create_shape_model相比只多了ScaleMin, ScaleMax, ScaleStep三个参数
常见的创建形状模板的算子
3、查看模板和创建模板中的Contrast对比度为了提取边缘
对称性和角度范围选择
如果模板匹配用于定位,则尽量不要选取对称的对象为模板
4、模板匹配过程
图像金字塔
如果金子塔为4层,则将图像按比例缩小,分为4个等级,先用金子塔层数为4的模板去匹配按比例缩小的等级为 4的原图像,找到相应目标后,在这个基础上再用金字塔为3的模板去匹配缩小的等级为3的原图像,如此。。。。。。最后直到用金字塔最底层的模板去匹配原图像,找到对应目标。这种手法有利于提升匹配效率
5、如果彷射变换affine_trans_contour_xld 算子以get_shape_model_contours 输出参数ShapeModel 为输入对象,刚性仿射变换 vector_angle_to_rigid的Row,column,angel坐标参数为0,0,0
get_shape_model_contours (ShapeModel, ModelID, 1)
vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject)
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)自己做模板时,可以先创建一个模板,然后保持模板图像不动,利用find_shape_model算子在模板图像中找到相应模板并输出该图像的中心坐标位置,该位置即为模板的中心位置,仿射变换时可以以该位置为模板的中心位置
模板匹配时大多数情况下用CAD做模板
6、inspect_shape_model(Image : ModelImages, ModelRegions : NumLevels, Contrast : )
查看模板的形状,需注意该算子输出的模板是一个骨架,骨架也是区域。常和算子gen_contours_skeleton_xld将骨架转轮廓一起使用,注意如果和gen_contours_region_xld将会输出不一样的效果
输出的模板(骨架) 中间白色的线条为骨架转轮廓
区域转轮廓
-
基于Matlab-图像匹配——模板匹配.docx
2021-04-18 07:57:14PAGE \* MERGEFORMATPAGE \* MERGEFORMAT 1课程名称 数字图像处理实验序号 实验8实验名称 图像匹配——模板匹配实验地点 综B207实验学时 2 实验类型 验证性2017年 10 月 16 日一、实验目的及要求在机器识别物体的... -
Halcon学习路线——模板匹配和仿射变换
2021-10-29 11:15:40模板匹配分类2. 看一个案例3. 资源下载 1. 模板匹配分类 halcon对模板匹配进行了详细的分类 基于灰度的模板匹配是最基础也是最简单的,但是由于其受光照影响很大,匹配的精度也不高,在实际项目当中往往不被采用... -
论文研究-基于模板匹配与塔式分解的蛋白质结构域分类.pdf
2019-07-22 20:53:20然后基于模板匹配和塔式分解, 提出了结构域特征; 最后在结构类和折叠子两个层次实施结构域分类。本方法在第一种验证策略的分类精度分别为907%和746%, 使用第二种验证策略的为938%和787%。相比其他方法, ... -
halcon模板匹配快速入门
2019-06-11 10:00:02匹配模板:find_aniso_shape_model 例子: 测试用的图像: 代码: dev_set_draw ('margin') read_image (Image, 'C:/Users/斌/Desktop/temp.png') rgb1_to_gray (Image, GrayImage) *... -
论文研究 - 通过快速模板匹配加速生成时空图集
2020-05-15 19:37:00特别是,我们已经实现了基于奇异值分解的快速模板匹配方法,并将其应用于生成具有合理时间和计算复杂度的高质量时空图集。 该性能已通过公共可访问数据集进行了系统评估。 结果和结论为进一步开发先进算法以加速... -
OpenCV探索之路(九):模板匹配
2021-03-09 08:36:42模板匹配的作用在图像识别领域作用可大了。那什么是模板匹配?模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术。说的有点抽象,下面给个例子说明就很明白了。在上面这幅全明星照中,... -
Python+Opencv实现图像匹配——模板匹配
2021-10-07 15:38:28简单来说,模板匹配就是拿一个模板(图片)在目标图片上依次滑动,每次计算模板与模板下方的子图的相似度,最后就计算出了非常多的相似度; 如果只是单个目标的匹配,那只需要取相似度最大值所在的位置就可以得出... -
Opencv 6种模板匹配
2019-01-29 19:19:46模板匹配适用于能匹配上的场景。如果图片中根本就没有你想要的匹配对象,这里也会给出一个假的匹配结果。假到你根本就没法判断到底有没有这个目标 经过多次实验,第四种效果最好 cv::TM_SQDIFF 判断 ... -
模板匹配算法原理与实现-opencv
2021-06-14 14:27:07模板匹配的原理就是将模板图像在源图像上进行滑动,上下左右的滑动,被模板图像盖住的部分叫做子图像。 然后计算模板图像与子图像的相似程度,模板左上角每移动一次计算一次,记录下该像素点的位置和模板与子图的... -
图像处理中的模板匹配
2021-12-17 12:14:31概念:把对同一景物在不同时间、不同成像条件下获取的多幅图像在空间上对准;根据已知模式到另一幅图中寻找相应模式的处理方法。 原理:在待搜寻的图像中,移动模板图像,在每个位置测量待搜寻图像的子图像和模板... -
模板匹配算法
2018-07-27 11:13:59模板匹配(Template Matching)算法 模板匹配(Template Matching)是图像识别中最具代表性的方法之一。它从待识别图像中提取若干特征向量与模板对应的特征向量进行比较,计算图像与模板特征向量之间的距离,用最小... -
基于模板匹配的目标跟踪法
2021-09-13 11:52:56多分辨率下的模板匹配是小波变换的重要应用。对图像的二维离散小波变换可将图像信号一层一层进行分解,一直对信号进 行分解,经过 N 层分解,原始图像 X 分解为:X=D +D +…+D +A 。 图 3 运动目标检测流程图 公式... -
OpenCV(项目)车牌识别3 -- 模板匹配
2021-09-06 10:04:254、模板匹配 5、匹配所有子文件夹,保存最佳得分(最匹配项) 三、大致过程(细分类,节省时间) 1、汉字匹配 2、英文字符匹配 3、数字/英文匹配 4、显示 模板匹配总代码 车牌识别总代码及效果 成功案例 ... -
python-OpenCV模板匹配、图像识别整理(五)
2022-02-23 15:20:00python,OpenCV模板匹配、图像识别整理 -
C#联合halcon编程多模板匹配 c#+halcon联合的颜色识别 C#和halcon联合编程ORG字符识别源码
2022-03-17 13:26:202、C#联合halcon编程多模板匹配 3.c#khalcon工厂淌量 4、c#联合halcon编程demo一航标控制图片缩放,拖动,roi 5.C#联合Halcon示例之按比例显示图片 6.C#与halcon联答编程实现鼠标滚轮事件,通过鼠标滚轮对halcon窗口... -
基于HO G特征的优化区域模板匹配检测 (2016年)
2021-05-14 19:23:40针对HOG 算法滑动窗口检测效率低和目标特征描述不精确的问题,提出了一种基于HOG的改进算法,提高了滑动窗口的检测效率并...结果表明,该算法对于静态图片有较高的准确率,且对于很多相似度不高的分类具有较快的检测速度. -
Halcon例程分析9:多模板形状匹配的物品分类
2019-12-24 17:53:41模板匹配(基于形状)->matching_coins.hdev 下面的例程经过改动,官方例程是用本地函数,我这里为方便说明把本地函数全部写在主函数中 * distinguishing of coins with the help of shape-based matching * ... -
Halcon 第五章『模板匹配Matching』◆第2节:基于灰度值的模板匹配|Gray-Value-Based
2022-04-19 19:44:10图像处理中的模式指的是对图像目标所具有的特征的描述,而模式识别(Pattern Recognition)就是利用计算机对图像目标进行分类,在错误概率最小的条件下使识别的结果尽量与客观事物符合。 图像模式识别的定义 人们... -
OpenCV 第七章 模板匹配和图像分割
2022-01-16 14:36:43模板匹配 定义:让模板图像在输入图像中滑动逐像素遍历整个图像进行比较,查找出与模板图像最匹配的部分。 单目标匹配 定义:输入图像中只存在一个可能匹配结果 基本格式如下: result = cv2.matchTemplate(image,...