‘壹’ 基于灰度的模板匹配
想将自己开发机器人视觉应用中的点滴过程和心得进行记录分享,讨论,生活很有趣,学术很有趣,当然能让自己做的研究落地更有意义!
可能的优化路径:
1.匹配路径优化算法:从图像预处理中改进,对模板匹配的较可能区域先定位,后进行精确的卷积运算,减低卷积计算量,但没有从根本上减少卷积运算计算量大的缺点。
2.通过傅里叶变换将函数的卷积运算转为乘积运算。
ps:opencv中的自适应阈值方法为adaptiveThreshold
金字塔分层快速图像搜索算法流程:
1.对降采样的图像进行自适应阈值化处理
2.处理完的图像通过森慧opencv快速模板匹配寻找最匹配悉裂的坐标:
cv::matchTemplate()
cv::normalize()
cv::minMaxLoc()
3.根据获取的降采样层的坐标获取源图像的坐标(*2.05),注意不要越出图像边界
源图像层根此陆答据放大后的坐标截取一个子图
4.在子图上进行快速模板匹配,搜索模板图像,返回搜索到的坐标
5.通过联合Hash算法确认源图像层坐标下的模板图像和原图像是否相似(可以选择别的相似度量函数)
在原图自适应阈值处理后的快速模板匹配函数处理时间为0.076s,加入金字塔处理后的时间为0.376s..
现在进行金字塔加速后进行阈值处理再进行模板匹配的时间。0.022s(第三层金字塔处),0.39s(带金字塔处理过程)
‘贰’ opencv(C++)GPU、CPU 模板匹配
本文主要关注opencv常规版和cuda版的模板匹配算法,网上cuda版的资料不多,这里做个记录,以后用到也好有个参考。
@[toc]
opencv cuda版需要自己用cmake编译,编译过程并不复杂,cmake编译成vs的项目,然后用vs编译成opencv_worldXXX.dll.编译燃尺租过程可参考 link1 , link2
GPU加速模板匹配看起来效果并不是很好,测试了不同大小的图片有的情况速度会超过CPU,本来觉得应该会有几倍的加速效果,但是其实并没有,大多数情况下反而是变慢了。开始觉得是cpu向gpu传图的过程耗时较多,后面去掉传图的过程只看匹配过程,它的计算就是比cpu的慢,不知道是不是因困历为这块GPU太低端了。皮兆
‘叁’ javaopencv模板匹配多个
热门频道
首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打开APP
032-OpenCV模板匹配单个对象、多个对象 原创
2022-01-30 11:06:14
逆鳞x
码龄3年
关注
话不多说,上代码,看结行氏果。
结果如下图。
在这里插入图片描述
接下来是模板匹配多个对象。
在这里插入图片描述
就先这样,遇到别的再补充。
文章知识点与官方知识档案匹配
OpenCV技能树首页概览
12102 人正在系统学习中
打开CSDN APP,看更多技术内容
SORT 多目标跟踪算法+opencv模板匹配算法实战——多个小球此镇跟踪,以及...
sort跟踪算法+opencv模板匹配实现小档扒散球跟踪 实现结果 rgb 灰度图像假彩色 二值化,提取坐标 SORT多目标跟踪算法 基于模板匹配的目标检测 模板匹配结果与SORT算法融合 完整代码 实现结果 先把最终结果放上来,个人感觉效果还是非常棒的。 rgb ...
继续访问
OpenCV多模板匹配讲解与匹配汽车实战(附python源码)_showswoller的博客...
模板匹配包括单模板匹配和多模板匹配,单模板匹配又包括单目标匹配和多目标匹配。实现这些内容的基础方法就是模板匹配方法,即matchTemplate()方法。其中,读者朋友重点掌握模板匹配方法的6个参数值。此外,为了实现单目标匹配,除了需要使用模板匹...
继续访问
MARCHTEST.zip_opencv_opencv模板匹配_多目标匹配_模板匹配_模板匹配 opencv
通过OPENCV库函数能是实现多目标模板匹配查找并且限定阈值
python OpenCV 模板匹配,单目标,多目标匹配,在一幅图像中找出与模板匹配的对象
1、单模板单目标,多目标匹配 2、多模板,多目标匹配 3、通过OpenCV模板匹配方法,实现图片的匹配功能 4、相关系数匹配,最小平方差匹配 5、matchTemplate
OpenCV(python)在一张图上进行多种模板多个方向匹配
在一张图像上进行多种模板在不同方向上的匹配
继续访问
OpenCV多模板匹配
多模板匹配
‘肆’ opencv 中自带的模板匹配算法出处
方法如下:
使用OPENCV下SIFT库做图像匹配的例程
// opencv_empty_proj.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//从文件中读入图像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");
//如果读入图像失败
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
if(img2.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//显示图像
imshow("image before", img);
imshow("image2 before",img2);
//sift特征检测
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
‘伍’ 模板匹配概述
模板匹配是通过一张模板图片去另一张图中找到与模板相似部分的一种算法。一个模板是一张小图片,这个图片有一定的尺寸,有角度(一般是不旋转的矩形, 角度为0)。
模板匹配算法一般是笑备通过滑窗的方式在待匹配的图像上滑动,通过比较模板与子图的相似度,找到相似度最大的子图。这种算法最核心部分在于如何设计一个相似性函数。
最容易想到的一个相似性函数便是欧式距离:
将这个相似性函数展开,可以得:
可以看出,只有第二项是有意义的,因为第一项和第三项的值在选定模板后是固定的。对于欧式距离相似函数,值越大表示越不相似,也就是说,第二项的值越小则越不相似。
将第二项进行归一化:
那么当R(i, j)为1时,表示模板与子图完全相等。
cv::matchTemplate(const CvArr* image, //欲搜索的图像。它应该是单通道、8-比特或32-比特 浮点数闷芹图像
const CvArr* template,//搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型
CvArr* result, //比较结果的映射图像。单通道、32-比特浮点数.
若图像是W×H而templ是w×h,则result一定是(W-w+1)×(H-h+1)
int method//CV_TM_SQDIFF、CV_TM_SQDIFF_NORMED、CV_TM_CCORR、
CV_TM_CCORR_NORMED、CV_TM_CCOEFF、CV_TM_CCOEFF_NORMED
);
函数来进行模板匹配。其中的method参数具体如下:
在通过matchTemplate函数进行模板匹配后,可以得到一个映射图,这张图中最大值的地方便是匹配度最大的子图的左上角坐标,可以使用cv::minMaxLoc函数获得子图位置和相应分数,再进行后续操作。
使用传统的模板匹配速度较快,但是无法应对旋转和缩放问题。要解决旋转不变的 问题,必须要碰罩毁得到旋转不变的特征量,例如特征点。
使用SIFT或SURF计算得到模板和待匹配图像的特征点,然后使用RANSAC或者FLANN进行特征点匹配, 最后进行仿射变换便可得到匹配的位置。
python opencv实现(surf):
# - - coding:utf-8 - -
author = 'Microcosm'
运行的具体信息如下:
操作系统:ubuntu 14.04
运行环境:
opencv版本:opencv 3.0
模板大小:126x96 png
匹配图像大小:750x407 jpg
特征提取时间:0.15 s
KNN匹配时间:0.0024s
匹配效果:
‘陆’ 验证码识别之模板匹配方法
在写爬虫的时候难免会遇到验证码识别的问题,常见的验证码识别的流程为:
- 图像灰度化
- 图像去噪(如图像二值化)
- 切割图片
- 提取特征
- 训练
但这种方法要切割图片,而且破解验证码的重点和难点就在于 能否成功分割字符 。
本文要介绍的算法 不需要进行图片切割,也不需要进行机器训练 ,这种方法就是模板匹配:将待识别的文字切割成一个个模板,在待识别的图像中去匹配模板。
这篇文章将分为两个部分:
第一部分介绍模板匹配的基本概念以及模板匹配的一种实现算法:快速归一化互相关匹配算法;
第二部分是一个具体实例。
模板匹配是在图像中寻找目标的方法之一,目的就是在一幅图像中寻找和模板图像最相似的区域。
模板匹配的大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。
假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:
从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;
用某种方法得出临时图像与模板的相似度c,存放到相似度矩阵中(矩阵大小为91 x91);
切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到相似度矩阵;
重复上述步骤,直到输入图像的右下角。
最终得到一个相似度矩阵,找到矩阵中的最大或最小值,最大值(最小值)对应的临时图像即为与模板最相似的图像。
在步骤b中,求模板与图像的相似度有多种方法,如平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、归一化互相关算法(NCC),本文使用的是归一化互相关算法。
什么是归一化互相关?
从几何图形上来看,空间中的两个向量,同方向平行时,归一化互相关系数为1,表示两个向量最相似,反方向平行时归一化互相关系数为-1,垂直时为0,表示最不相似(用互相垂直的三个向量来代表整个空间也是这个道理,垂直的向量之间不包含对方的信息,相关系数为0),存在一定夹角时处于(-1,1),是不是跟余弦函数很像,cos(0)=1,cos(pi/2)=0,cos(pi)=-1。就是这个样子的,相关系数可以看作是两个向量之间夹角的cosine函数。
在数学中是这么计算cosine函数的,假设两个n维向量X,Y,对应的坐标分别为(x1,x2,…xn), (y1,y2,…yn) 则:
(如果想要了解更多,请参考文献【2】)
但这是一维的,在模板匹配中要再加一个维度 (具体算法请参考文献【3】) ,简要说一下文献【3】的内容:如果直接计算二维相似度的话计算复杂度会非常高,文献【3】利用快速傅里叶变换与积分图像快速算法来降低计算复杂度。
接下来让我们看一个具体的应用。
模板匹配识别验证码的具体步骤为:
1. 找出图片中所有可能出现的字符,制作成模板集合
2. 图像灰度化
3. 图片去噪(二值化)
4. 模板匹配
5. 匹配结果优化
要识别的图片如下,以识别图片中的加字为例:
要从image中找到与模板最匹配的部分,Template图像是事先从image图像中截取的一部分。所用的为python模块skimage中的match_template方法,match_template方法使用的是快速归一化互相关算法 【2】 。
遍历模板图像集合,与图像匹配,如果dist大于阈值h,则认为此模板在图像中存在,否则不存在,继续匹配下一个模板,直到遍历完所有模板。
以模板‘加’为例,图像大小为40x260,模板大小27x27,result是一个大小为(14,234)的矩阵,即上文提到的相似度矩阵,矩阵中的数值属于[-1,1],找到result中最大值所处的对应位置即为与模板最匹配的图像位置:x=66,y=11,正好对应模板图像在image中所处的位置。 (更多内容请参阅参考文献【4】)
但这是比较好的情况,因为在匹配时遍历了所有的模板,而一张图片中出现的模板数量是有限的,比如数字’四’在图片中是没有的,这时就要根据某种规则去掉这些在图片中没有出现的模板:程序中使用dist变量来过滤匹配结果,如果dist变量大于某个值则认为此模板在图像中不存在。
最后的result_list中可能仍然存在一些图片中不存在的模板或者匹配不精确的模板,比如数字‘一’在模板中不存在,但仍然可以匹配到,因为数字‘二’中可以匹配到‘一’,需要进一步优化,优化方法有很多,比如当匹配到的两个模板距离过近时,选择较大的那个模板,其余方法留给读者自行考虑吧。
后续将会推出如何使用深度学习识别验证码,敬请期待~
参考文献:
http://www.cnblogs.com/beer/p/5672678.html
http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
J. P. Lewis, “Fast Normalized Cross-Correlation”, Instrial Light and Magic.
http://scikit-image.org/docsjinhqin/dev/auto_examples/plot_template.html
本文作者 :李晖(点融黑帮),毕业于电子科技大学,现就职于点融成都Data部门,对一切新鲜事物充满好奇,对跳舞毫无抵抗力的活力女青年一枚。
‘柒’ 人体行为识别有哪些算法
人体行为识别前已仿氏有的方法主要分为三大类:基于模板的方法,基于概率统计的方法和基于语义的方法。
模板匹配是一种较早用在人体运动识别上的方法,将运动图像序列转化为一个或一组静态的模板,通过将待识别样本的模板与已知的模板进行匹配获得识别结果。
在行为识别中,基于模板匹配的算法可以分为帧对帧匹配方法和融合匹配方法。
主要方法有:运动能量图像(MEI)和运动历史图像(MHI),基于轮廓的平均运动形状(MMS)和基于运动前景的平均运备键散动能量(AME)等。
概率统计方法进行运动识别是把运动的每一种静态姿势定义为一个状态或者一个状态的 *** ,通过亮宴网络的方式将这些状态连接起来,状态和状态之间的切换采用概率来描述。
主要有隐马尔科夫模型HMM, 最大熵马尔科夫模型(MEMM),条件随机场(CRF)等。
‘捌’ 模板匹配属于深度学习吗
1 不属于深度学习
2 因为模板匹配是一种传统的计算机视觉技术,它基于像素纳颂银级别的比较和匹配,不涉及神经网络等深度学习樱坦技术。
3 当然洞宴,模板匹配可以和深度学习结合使用,例如在深度学习模型的输出结果中进行模板匹配来进一步提高识别准确率,但单独的模板匹配不属于深度学习的范畴。