使用OpenCV实现Halcon算法(2)形状匹配开源项目,shape_based_matching

简介: 使用OpenCV实现Halcon算法(2)形状匹配开源项目,shape_based_matching

目前市面上的商业软件,VisionPro的PatMax算法,Halcon的形状匹配算法都是基于边缘的模版匹配。



1、GeoMatch,Edge-Based-Template-Matching


OpenCV实现边缘模板匹配算法


https://cloud.tencent.com/developer/article/1440371


匹配相似度的计算公式:

image.png



用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)

image.png



首先提取图像的特征,再生成特征描述子,最后根据描述子的相似程度对两幅图像的特征之间进行匹配。图像的特征主要可以分为点、线(边缘)、区域(面)等特征,也可以分为局部特征和全局特征。


区域(面)特征提取比较麻烦,耗时,因此主要用点特征和边缘特征。


点特征包括: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


相关文章
|
26天前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
62 0
|
2月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
3月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
432 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
5月前
|
机器学习/深度学习 算法 计算机视觉
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
136 3
基于opencv的SVM算法的车牌识别系统设计与实现
|
5月前
|
计算机视觉
OpencV图像几何形状绘制
OpencV图像几何形状绘制
|
5月前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
97 0
|
5月前
|
机器学习/深度学习 编译器 算法框架/工具
OpenCV算法库
numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。
|
6月前
|
算法 计算机视觉
【OpenCV】- 分水岭算法
【OpenCV】- 分水岭算法
|
6月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
282 0
|
16天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。