目前市面上的商业软件,VisionPro的PatMax算法,Halcon的形状匹配算法都是基于边缘的模版匹配。
1、GeoMatch,Edge-Based-Template-Matching
OpenCV实现边缘模板匹配算法
https://cloud.tencent.com/developer/article/1440371
匹配相似度的计算公式:
用opencv编写的形状匹配算法,但不具旋转和缩放功能。
https://www.codeproject.com/articles/99457/edge-based-template-matching
https://www.codeproject.com/KB/graphics/Edge_Based_template_match/GeoMatch_src.zip
https://gitee.com/e1ki0lp/Edge-Based-Template-Matching
https://download.csdn.net/download/zfjbit/10732568 GeoMatch_src(VS2015+OpenCv3.3版)
2、shape_based_matching
上海交通大学机器人所(★★★重点推荐★★★)
尝试实现基于halcon形状的匹配,请参阅halcon工程师编写的《机器视觉算法和应用》,第317 3.11.5页,
try to implement halcon shape based matching, refer to machine vision algorithms and applications, page 317 3.11.5, written by halcon engineers
https://github.com/meiqua/shape_based_matching ++ https://www.zhihu.com/people/mei-qu-a
https://github.com/daxiaHuang/shape_based_matching_subpixel
https://github.com/wangyuou/QVision 第三方作者使用Qt调用这个Shape Match库
基于形状的匹配与opencv linemod算法有相似之处。但是与opencv linemod src相比,我们从6个方面进行了改进:
删除深度模态,因此我们不需要虚拟功能,这可能会加快速度
opencv linemod不能使用超过63个功能。现在最多可以有8191个
用于旋转和缩放img的简单代码,以进行培训。有关示例,请参见test.cpp
nms用于精确的边缘选择
一个通道的方向提取可节省时间,灰色img的速度稍快
将MIPP用于多个平台SIMD,例如x86 SSE AVX,arm neon。为了获得更好的性能,我们将MIPP扩展到uint8_t以获得一些说明(否则我们只能使用半个特征点来避免int8_t溢出)
直接旋转特征以加快模板提取;selectScatteredFeatures更均匀;详尽选择所有功能(如果不够),而不是中止模板(但功能<= 4会中止)
3、其他相关的博文
基于边界的模板匹配的原理及算法实现
https://blog.csdn.net/huixingshao/article/details/45560643 基于边界的模板匹配的原理及算法实现,文章很火
https://download.csdn.net/download/huixingshao/8672275
https://blog.csdn.net/pww71/article/details/81067039 原创:突破halcon核心技术--模板匹配算法
一种基于边缘的模版匹配算法
https://blog.csdn.net/Backspace110/article/details/80767200
opencv实现基于边缘的形状匹配算法
https://github.com/zhouqun92/ShapeMatch
https://github.com/dmccskylove/ShapeMatch
linemod形状匹配算法
https://github.com/cuijianzhu/linemod
https://github.com/wg-perception/linemod
https://blog.csdn.net/zmdsjtu/article/details/79933822
4、图像匹配算法分为3类:
基于灰度的匹配算法、基于特征的匹配算法、基于关系的匹配算法
(1)基于灰度的模板匹配算法:模板匹配(Blocking Matching)是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像。基于灰度的匹配算法也称作相关匹配算法,用空间二维滑动模板进行匹配,不同匹配算法主要体现在相关准则的选择方面,常见的基于模板的匹配算法可以参考下面的链接:
参考:基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法
http://blog.csdn.net/hujingshuang/article/details/47759579
(2)基于特征的匹配算法:(也叫图像配准,Image Registration)
首先提取图像的特征,再生成特征描述子,最后根据描述子的相似程度对两幅图像的特征之间进行匹配。图像的特征主要可以分为点、线(边缘)、区域(面)等特征,也可以分为局部特征和全局特征。
区域(面)特征提取比较麻烦,耗时,因此主要用点特征和边缘特征。
点特征包括:Harris 、Moravec、KLT、SIFT、SURF 、BRIEF、SUSAN、FAST、CENSUS、FREAK(点击打开链接)、BRISK(点击打开链接)、ORB、光流法(点击打开链接)、A-KAZE等。
边缘特征包括:LoG算子、Robert算子、Sobel算子、Prewitt算子、Canny算子等。
对于所有类型的几何变换,SIFT和BRISK的总体精度最高,SIFT被认为是最精确的算法。定量比较表明,特征检测描述器检测大量特征的能力的一般顺序为:
ORB>BRISK>SURF>SIFT>AKAZE>KAZE
特征检测描述器的整体图像匹配速度顺序为:
ORB (1000) >BRISK (1000) >AKAZE>KAZE>SURF (64D)>SIFT>ORB>BRISK>SURF (128D)
经典的特征匹配算法有SIFT、SURF、ORB等,这三种方法在OpenCV里面都已实现。SURF基本就是SIFT的全面升级版,
有SURF基本就不用考虑SIFT,而ORB的强点在于计算时间,以下具体比较:
计算速度:ORB>>SURF>>SIFT(各差一个量级)
旋转鲁棒性:SURF>ORB~SIFT(~表示差不多)
模糊鲁棒性:SURF>ORB~SIFT
尺度变换鲁棒性:SURF>SIFT>ORB(ORB并不具备尺度变换性)
所以结论就是,如果对计算实时性要求非常高,可选用ORB算法,但基本要保证正对拍摄;如果对稳定性要求稍高,可以选择SURF;基本不用SIFT。
此外补充一点,自从OpenCV3.x开始,受到SIFT跟SURF专利授权的影响,OpenCV正式的发布版本中已经移除了SIFT跟SURF算法。
ORB特征提取算法是基于FAST跟BRIEF算法改进的组合算法,其中FAST实现关键点/特征点的检测,在此基础上基于几何矩添加方向属性,
BRIEF实现描述子生成,添加旋转不变性支持。
ORB特征匹配速度快的一个原因之一就是使用字符串向量的描述子,避免了浮点数计算。字符串描述子匹配上可以采用汉明距离或者LSH改进算法实现,
相比浮点数计算L2距离进一步降低了计算量。所以在一般情况下建议使用ORB特征匹配,如果效果不好再尝试AKAZE/SURF/SIFT等其它特征匹配算法。
(3)基于关系的匹配算法:建立语义的网络,是人工智能领域在图像处理中的应用,但还没有突破性的进展。
参考文献,摘自知乎:计算机视觉中,目前有哪些成熟的匹配定位算法?
1、可以看一下主流的商业机器视觉库,比如Halcon,康耐视的VisionPro及它的PatMax专利算法,OpenVision里的Match和Find模块,这些商业库里的匹配算法都占有很高的篇幅和重要性,而它们的鲁棒性也不是一般算法可以比拟的。
再推荐一本书,《机器视觉算法及应用 Machine vision algorithm and Application》,是Halcon的资深研发人员写的,有一章,模版匹配,里有介绍Halcon里实现的匹配算法的实现原理。这本书里面没有代码,也没有公式验证,有少量必要的公式罗列。
http://product.dangdang.com/1511962373.html
http://product.dangdang.com/1521862365.html
2、可以用一些工具 (在Github上搜索Find-Object或者Template matching) 实际看看
3、GMS了解一下;要求实时(精度也不差): orb+GMS;要求精度: A-SIFT+GMS;相同程度匹配,速度精度比RANSAC效果好
4、sift/surf+flann+ransac,一般情况都好使
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT)
SURF,(SpeededUpRobustFeatures),是对SIFT的一种改进,主要特点是快速。
Sift算法的优点是特征稳定,对旋转、尺度变换、亮度保持不变性,对视角变换、噪声也有一定程度的稳定性;缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱。
Surf(Speeded Up Robust Features)改进了特征的提取和描述方式,用一种更为高效的方式完成特征的提取和描述。
5、Face Detection,Template Matching , SURF , SIFT to detect features and keypoints in images .
https://github.com/vishalgolcha/ImageMatching
https://blog.csdn.net/qq21497936/article/details/107348874 cv::BFMatcher暴力匹配
6、opencv+python实现图像匹配----模板匹配、特征点匹配
https://blog.csdn.net/zhuisui_woxin/article/details/84400439
Python 使用Opencv实现图像特征检测与匹配
https://blog.csdn.net/HuangZhang_123/article/details/80660688
自动驾驶汽车视觉- 图像特征提取与匹配技术
https://zhuanlan.zhihu.com/p/133301967
https://github.com/williamhyin/SFND_2D_Feature_Tracking
7、一步一步实现多尺度多角度的形状匹配算法(C++版本)
https://blog.csdn.net/KayChanGEEK/article/details/84309192
8、Boyer-Moore 精确匹配算法实现(C/C++)
https://blog.csdn.net/ChrisNiu1984/article/details/7335992
https://blog.csdn.net/u014085000/article/details/22220107