项目描述

最近在看opencv相关的知识,看到了模板匹配,记录下来方便日后使用
简单的模板匹配(单模板)
多模板匹配
带角度的模板匹配

创作不易,点个关注呗 ^ _ ^

函数介绍

头文件:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

matchTemplate

模板匹配的主要函数 匹配并不是基于直方图的,
参数1:待匹配图像
参数2:模板,要求尺寸小于原图像
参数3:比较结果的映射图像
参数4:图像匹配方式 共6种 计算量不同,匹配精度也不同。

  • 平方差匹配(TM_SQDIFF):最好匹配为0,匹配越差值越大
  • 归一化平方差匹配(TM_SQDIFF_NORMED)
  • 相关匹配(TM_CCORR) 0最坏 值越大匹配越好
  • 归一化相关匹配(TM_CCORR_NORMED)
  • 系数匹配(TM_CCOEFF) 匹配相关性 1完美 -1糟糕 0无相关性
  • 化相关系数匹配(TM_CCOEFF_NORMED)

normalize

函数作用:
归一化数据。该函数分为范围归一化与数据值归一化。
其实范围归一化和数值归一化可以归为一类,一般来说数值归一化是指将数值归一到[0,1]区间上,
而范围归一化则指将数值归一到[a,b]上,a,b为任意值。由此看出,数值归一化是范围归一化的特例,包含在范围归一化中。
参数说明:

  • src 输入数组;
  • dst 输出数组,数组的大小和原数组一致;
  • alpha 用来规范值或者规范范围,并且是下限;
  • beta 只用来规范范围并且是上限,因此只在NORM_MINMAX中起作用;
  • norm_type 归一化选择的数学公式类型;
  • dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同 的地方由dtype决定;
  • mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。

minMaxLoc

从一个矩阵中找出全局的最大值和最小值。

  • 参数1 src 输入单通道矩阵.
  • 参数2 minVal 返回最小值的指针; 如果不需要输入NULL.
  • 参数3 maxVal 返回最大值的指针; 如果不需要输入NULL.
  • 参数4 minLoc 返回最小值位置的指针 (二维情况下); 如果不需要输入NULL.
  • 参数5 maxLoc 返回最大值位置的指针 (二维情况下); 如果不需要输入NULL.
  • 参数6 mask 可选参数,用于选择一个子矩阵.

rectangle

  • 参数 img 输入图像。
  • 参数 pt1 矩形的顶点。
  • 参数 pt2 对应pt1的矩形的顶点。
  • 参数color 矩形颜色或亮度(灰度图像)。
  • 参数thickness 构成矩形的线条的厚度。负值,比如FILLED,意味着函数必须绘制一个填充矩形。
  • 参数lineType 线的类型. 参见 LineTypes
  • 参数shift 点坐标中的小数位数

测试代码运行时间

 QTime t = QTime::currentTime();GetOneMinLoc(g_srcImage, g_tempalteImage, p, TM_SQDIFF_NORMED);int elapse = t.msecsTo(QTime::currentTime());

代码示例

读取图片

    QString filename = QFileDialog::getOpenFileName(this, QString("读取最后结果"),QString("./file"),QString("File(*.*)"));g_srcImage = imread(filename.toStdString().c_str());if (!g_srcImage.data) {qDebug() << "原始图读取失败";return ;}filename = QFileDialog::getOpenFileName(this, QString("读取最后结果"),QString("./file"),QString("File(*.*)"));g_tempalteImage = imread(filename.toStdString().c_str());if (!g_tempalteImage.data) {qDebug() << "模板图读取失败";return ;}

单模板匹配

调用:
{Point p;GetOneMinLoc(g_srcImage, g_tempalteImage, p, TM_SQDIFF_NORMED);rectangle(g_srcImage, Rect(p.x, p.y, g_tempalteImage.cols, g_tempalteImage.rows), Scalar(0, 0, 255), 2, 8);imshow("src Window", g_srcImage);waitKey(0);
}
/* GetOneMinLoc* 函数说明:* 进行单一化模板匹配* 参数1:待匹配图片* 参数2:模板图片* 参数3:匹配的位置* 参数4:匹配类型
*/
double GetOneMinLoc(Mat image, Mat tepl, Point& point, TemplateMatchModes method) {int result_cols =  image.cols - tepl.cols + 1;int result_rows = image.rows - tepl.rows + 1;Mat result = Mat( result_cols, result_rows, CV_32FC1 );matchTemplate(image, tepl, result, method );double minVal, maxVal, Value;Point minLoc, maxLoc;minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());if(method == TM_SQDIFF || method == TM_SQDIFF_NORMED) {point = minLoc;Value =  minVal;} else {point = maxLoc;Value =  maxVal;}rectangle(result, Rect(point.x, point.y, tepl.cols, tepl.rows), Scalar(0, 0, 255), 2, 8);imshow("resault Window", result);return Value;
}

多模板匹配

调用
{vector<Point> P;//存储所有检测目标的坐标GetAllMinLoc(g_srcImage, g_tempalteImage, 0.18, Scalar(0, 0, 0), &P);//根据获取的全部坐标数据圈出待检测目标qDebug() << "rect" << P.size();for (int k = 0; k < P.size(); k++) {Point loc = P[k];rectangle(g_srcImage, Rect(loc.x, loc.y, g_tempalteImage.cols, g_tempalteImage.rows), Scalar(0, 0, 255), 2, 8);
}
/*
/* GetAllMinLoc* 参数说明:* image:输入原图像* templ:输入的模板图像* sim:   相似度,0~1之间,越接近0越相似* mask: 覆盖区颜色,一般情况下直接取黑色即可Scalar(0,0,0)* *all_min_loc:所有匹配到的目标的坐标*/
void GetAllMinLoc(Mat image, Mat templ, double sim, Scalar mask, vector<Point>* all_min_loc) {int src_Width = image.cols, src_Height = image.rows;int templ_Width = templ.cols, templ_Height = templ.rows;double min_value, max_value;Point min_Loc, max_Loc;Mat img_result;Mat img_clon = image.clone();if (templ_Width > src_Width || templ_Height > src_Height) {qDebug("模板尺寸大于原图像,请选择正确的模板\n");}while (1) {matchTemplate(img_clon, templ, img_result, TM_SQDIFF_NORMED);minMaxLoc(img_result, &min_value, &max_value, &min_Loc, &max_Loc);if (min_value < sim) {// 预期内all_min_loc->push_back(min_Loc);// 去掉已检测部分rectangle(img_clon, Rect(min_Loc.x, min_Loc.y, templ_Width, templ_Height), mask, -1);} else {qDebug() << "超出预期的匹配程度";break;}}
}
// 代码优化:
void GetAllMinLoc(Mat image, Mat templ, double sim, Scalar mask, vector<Point>* all_min_loc) {Point p;Mat srcImg = image.clone();while(1) {if(GetOneMinLoc(srcImg, templ, p, TM_SQDIFF_NORMED) < sim) {all_min_loc->push_back(p);rectangle(srcImg, Rect(p.x, p.y, templ.cols, templ.rows), mask, -1);//掩盖检测到的第一块区域} else {break;}}
}

识别优化:使用灰度图像进行识别代码运行速度会加快很多

进阶

在模板匹配中通常没有完全一样的图片,这样就需要匹配大小不同的图像。
这样的匹配有以下两种方式:

  1. 改变模板图像的比例来适配
  2. 准备不同比例的模板来匹配
  3. 修改原来图像的比例来适配模板
    下面将对这些进行尝试和分析。

代码流程:

  1. 载入图像与模板;
  2. 将模板图像等比例放大或缩小
  3. 将不同的比例和图像适配
  4. 得到匹配区域的图片
  5. 将得到的ROI图片与原始模板进行相似性比较
  6. 筛选出相似性最好的ROI区域
  7. 在待测图片上进行框选
  8. 输出图片

opencv_模板匹配相关推荐

  1. 《OpenCV3编程入门》学习笔记9 直方图与匹配(五)模板匹配

    9.5 模板匹配 基本思想:   在一幅图像中寻找与另一幅模板图像最匹配的部分,通过在输入图像上滑动图像块,对实际的图像块和输入图像进行匹配. 9.5.1 模板匹配:matchTemplate()函数 ...

  2. OpenCV+python:模板匹配

    1,模板匹配的概念及原理 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 我们需要2幅图像: 模板 (T): 将和原图像比照的图像块 原图像 (I): 在这幅图像里,我们希望 ...

  3. OpenCV(项目)车牌识别3 -- 模板匹配

    目录 一.基础理论 1.思想 2.大致过程 二.详细过程 1.首先需要模板库 2.得到模板 3.原图限定大小 4.模板匹配 5.匹配所有子文件夹,保存最佳得分(最匹配项) 三.大致过程(细分类,节省时 ...

  4. OpenCV(二十)模板匹配

    目录 一.基础理论 1.作用与过程 2.原理 3.函数matchTemplate 二.代码 三.效果 参考资料 一.基础理论 1.作用与过程 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域, ...

  5. 人眼模板匹配自动跟踪

    void trackEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) {// 人眼位置cv::Size pSize(rect.wid ...

  6. OpenCV中使用模板匹配识别空闲的货架空间

    但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...

  7. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  8. python opencv模板匹配多目标_基于opencv的多目标模板匹配

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #includ ...

  9. OpenCvSharp手绘ROI区域+模板匹配+霍夫变换检测圆的边界

    最终效果如下: 左侧为检测图片.右侧为模板,右下角textbox为轮毂中心的像素坐标 操作步骤: 1.点击打开图像选择一张比较不错的图片,用于画模板: 2.在picturebox中画取ROI区域生成模 ...

最新文章

  1. c语言 listview,C语言 SDK编程之通用控件的使用--ListView
  2. MPLS标签分发、通告及管理方式
  3. 处理图片(updated)
  4. javascript数组的属性、方法和清空-最全!!!(必看)
  5. 论文翻译 基于R-FCN的物体检测
  6. 图片效果集合(js、jquery或html5)
  7. 1200万的天价离职赔偿!
  8. 分布式一致性算法 之 Paxos算法
  9. 阿里云云计算 5 阿里云的基础架构
  10. 自己动手——实现台达PLC远程监控数据采集
  11. matlab用插值法plot,Matlab插值法
  12. 局域网限制网速软件_五款大学生小众有用软件,学长亲荐
  13. c#选择文件保存路径
  14. 微信王者登录太多服务器怎样删除,使用微信登录游戏或其他app时,可以使用不同的个人信息登录 选项已满 怎么删除?如图...
  15. 基于Python的无参考图像质量评价
  16. file_get_contents
  17. kprobe与perf probe使用简单记录
  18. 学习Python第四天
  19. 他大叫了一声:“筋斗云”。。。
  20. matlab 怎样画颜色渐变曲线

热门文章

  1. 【java】删除文件夹及文件夹中的所有文件
  2. 基于马尔可夫过程的一种新型混合PSO粒子群算法(SCI二区高被引文献)介绍及算法复现(使用chatgpt)
  3. C的函数 gotoxy()
  4. 主题建模-corpora语料库-PCA进行降维
  5. PHP云招聘系统H5(源码+数据库脚本)
  6. 软考_法律法规与标准化知识
  7. 纯CSS3写的10个不同的酷炫图片遮罩层效果
  8. mysql数据库的介绍与初始配置
  9. 前端代码规范——CSS代码规范
  10. python操作ymal文件之PyYAML库的使用