模板匹配的作用在图像识别领域作用可大了。那什么是模板匹配?

模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术。

说的有点抽象,下面给个例子说明就很明白了。

在上面这幅全明星照中,我们想找出姚明头像的位置,并把它标记出来,可以做到吗?

可以,这就是模板匹配的要做的事情。

其实模板匹配实现的思想也是很简单很暴力的,就是拿着模板图片(姚明头像)在原图(全明星照)中从左上至右下依次滑动,直到遇到某个区域的相似度低于我们设定的阈值,那么我们就认为该区域与模板匹配了,也就是我们找到了姚明的位置,并把它标记出来。

OpenCV中是通过MtachTemplate函数完成。

#include

#include

#include

#include

#include

using namespace std;

using namespace cv;

int main()

{

Mat img, templ, result;

img = imread("nba.jpg");

templ = imread("76.png");

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, CV_TM_SQDIFF_NORMED);//这里我们使用的匹配算法是标准平方差匹配 method=CV_TM_SQDIFF_NORMED,数值越小匹配度越好

normalize(result, result, 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 << "匹配度:" << minVal << endl;

matchLoc = minLoc;

rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);

imshow("img", img);

waitKey(0);

return 0;

}

结果看来,大姚的头像位置确实被绿框标记出来了!很准!

我还在程序中特意打印出匹配度的最小值,因为我们知道这个算法是数值越小匹配度越高,由输出的结果看来这个数值还真的很小,说明匹配度真的相当高!

既然我们可以取得匹配度的数值,那我们是不是也可以利用该数值进行阈值对比呢?比如我想把在阈值范围之内的头像都标记出来。可以这么做:

//阈值判别,小于0.01才认为匹配成功,才将头像框出来

if (minVal < 0.001)

{

rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);

}

同理,如果是数值越大表明匹配度越大的算法,就使用maxVal来对比就可以了。

上面的模板匹配我们使用了标准平方差匹配 CV_TM_SQDIFF_NORMED算法,看起来效果还不错,那还有其他算法吗?

问得好。OpenCV通过函数 matchTemplate 实现了模板匹配算法。可用的方法有6个:

通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。

最好的办法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案。

你想采用哪种算法,只需要将对应的传进函数matchTemplate里就可以了。

下面给出利用trackbar显示出多种模板那匹配算法的代码。

#include

#include

#include

#include

using namespace cv;

using namespace std;

Mat g_srcImage, g_tempalteImage, g_resultImage;

int g_nMatchMethod;

int g_nMaxTrackbarNum = 5;

void on_matching(int, void*)

{

Mat srcImage;

g_srcImage.copyTo(srcImage);

int resultImage_cols = g_srcImage.cols - g_tempalteImage.cols + 1;

int resultImage_rows = g_srcImage.rows - g_tempalteImage.rows + 1;

g_resultImage.create(resultImage_cols, resultImage_rows, CV_32FC1);

matchTemplate(g_srcImage, g_tempalteImage, g_resultImage, g_nMatchMethod);

normalize(g_resultImage, g_resultImage, 0, 2, NORM_MINMAX, -1, Mat());

double minValue, maxValue;

Point minLocation, maxLocation, matchLocation;

minMaxLoc(g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation);

if (g_nMatchMethod == TM_SQDIFF || g_nMatchMethod == CV_TM_SQDIFF_NORMED)

{

matchLocation = minLocation;

}

else

{

matchLocation = maxLocation;

}

rectangle(srcImage, matchLocation, Point(matchLocation.x + g_tempalteImage.cols, matchLocation.y + g_tempalteImage.rows), Scalar(0, 0, 255), 2, 8, 0);

rectangle(g_resultImage, matchLocation, Point(matchLocation.x + g_tempalteImage.cols, matchLocation.y + g_tempalteImage.rows), Scalar(0, 0, 255), 2, 8, 0);

imshow("原始图", srcImage);

imshow("效果图", g_resultImage);

}

int main()

{

g_srcImage = imread("nba.jpg");

if (!g_srcImage.data)

{

cout << "原始图读取失败" << endl;

return -1;

}

g_tempalteImage = imread("76.png");

if (!g_tempalteImage.data)

{

cout << "模板图读取失败" << endl;

return -1;

}

namedWindow("原始图", CV_WINDOW_AUTOSIZE);

namedWindow("效果图", CV_WINDOW_AUTOSIZE);

createTrackbar("方法", "原始图", &g_nMatchMethod, g_nMaxTrackbarNum, on_matching);

on_matching(0, NULL);

waitKey(0);

return 0;

}

当然也会有一些算法匹配失败的.

实验证明,该段程序效果很不错,但注意的是,模板配在原图抠出模板图的形式下准确率才比较高,不然的话可能准确度就不太高了。

那么模板匹配能在哪些项目有应用呢?我说一下我的经验。

最近我在参与实验室的一个项目,做的是发票的分类,分类的方法我首先采用的是模板匹配,也就是从一类发票中抠出一些特征区域,以此作为模板,自己设定阈值,低于阈值就是算是跟该类发票匹配了,就可以 对其进行分类。在我的测试看来,准确率还可以,不过也隐藏这一个比较大的隐患就是,一旦发票种类多了,比如100种,那么检测时间就会指数上升,这是不可取的。

java opencv 模板匹配算法_OpenCV探索之路(九):模板匹配相关推荐

  1. java opencv 物体检测_OpenCV.物体识别

    1.度娘:"OpenCV 物体识别" ZC:主看这个,讲的比较细致,操作一般都是使用的 OpenCV里面的exe,一些代码是 java的 可以搞定,最后一段测试代码 是Python ...

  2. java opencv 相似度_opencv使用 java 对比两个人脸的相似度

    1.创建Java工程,并导入如下jar包 opencv-440.jar 2.编写代码 import org.opencv.core.*; import org.opencv.imgcodecs.Img ...

  3. java opencv 阀值分割_opencv 阈值分割的具体使用

    阈值分割 像素图 原始图像像素图 见下面 红色线:标注一条阈值线 二进制阈值化 首先设定一条阀值线 如127 大于127的像素点灰度值设为最大(如unit8的格式为255) 小于127的像素点灰度值设 ...

  4. java opencv 调用摄像头_opencv C++实现调用摄像头动态识别人脸

    前言 #include #include #include #include #include #include #include #include #include #include using n ...

  5. java opencv 提取车牌_opencv 学习之 车牌提取

    车牌识别分两步,一是车牌提取,而是字符识别. 下面是车牌提取. VS2010. OpenCV249. //载入图像 char * path = "d:\\picture\\06.jpg&qu ...

  6. 使用OpenCV实现Halcon算法(4)OpenCV实现边缘模板匹配算法

    声明:本篇仅仅是分享网上的开源项目,算法非本人原创. 本文转自:OpenCV研习社 干货 | OpenCV实现边缘模板匹配算法 - 云+社区 - 腾讯云 干货 | OpenCV实现边缘模板匹配算法 - ...

  7. Java + OpenCV 模板匹配

    何为模板匹配 模板匹配就是在指定模板图片中,在模板区域内找寻与待匹配图片中最相似的.通过不断滑动模板图片,计算其与待匹配图片区域的匹配度,将匹配度最高区域视为最终匹配结果. 实现方法 Imgproc. ...

  8. 图像处理/人工智能/opencv之深入理解模板匹配算法

    目录 **1.什么是模板匹配** **2.模板匹配算法** **3.介绍opencv相关api** 1.什么是模板匹配 简单来说模板匹配就是通过现有的模板去与图片进行比较找出图中所匹配的图像 例如网红 ...

  9. OpenCV模板匹配算法详解

    本博客在https://www.cnblogs.com/zhaoweiwei/p/OpenVC_matchTemplate.html基础上进行更加详细的注解.当初有几个地方看的比较费劲,但是里面没有注 ...

最新文章

  1. RHEL6基础四十三之RHEL文件共享②Samba简介
  2. 北理工团队在推动运动意图神经解码走向真实应用场景方面取得研究进展
  3. [Machine Learning] Random Forest 随机森林
  4. 单步调试学习WordPress PHP文件的加载顺序
  5. #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!
  6. 动态规划——基本思想
  7. 【Spring 】Synchronized锁在Spring事务管理下,为啥还线程不安全?
  8. java调用下载窗口_java 从网络Url中下载文件 java调用url接口
  9. 用HTML语言制作一个非常浪漫的生日祝福网,手把手教你制作炫酷生日祝福网页
  10. OBS美颜滤镜插件(BF+)——OBS美颜解决办法
  11. 保护模式下的80386及其编程03:保护虚拟地址方式
  12. 第八章 - 轮廓 - 查找轮廓、表示轮廓、绘制轮廓
  13. 如何在UltraCompare中编辑文件?
  14. 微信公众号回复消息换行符处理
  15. 计算机网络首地址和末地址公式,计算机中的地址即为存储单元的编码,一个首地址为1000H,容量为16KB的存储区域,末地址为________H。...
  16. Java集合移除某个元素
  17. pcie数据反_理解PCIE链路反转和极性反转
  18. 尚鼎峰:抖音短视频是如何在几秒钟内吸引用户观看的?
  19. 哈尔滨工程大学学生郭天祥六年非一般的大学
  20. MATLAB_遗传神经网络

热门文章

  1. 易语言 多线程 记录
  2. 如何免费获取百度文档,简单实用,2013亲测
  3. Linux X11 程序下都有神马
  4. ssm框架可以不用ajax,SSM框架关于后台返回JSON数据中显示很多不需要的字段为NULL...
  5. avd修改dns方法(android studio 中修改虚拟机DNS)
  6. 机器学习11:演化学习
  7. 线性代数学习笔记——行列式的性质及拉普拉斯定理——11. 拉普拉斯定理
  8. 【翻译】Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector论文翻译
  9. 没有苹果手机制作上架截图
  10. spacemacs使用彩虹猫