cnn网络:

superpoint 18年的,

https://github.com/magicleap/SuperPointPretrainedNetwork

cnn图像匹配:权重5m torch

https://github.com/DagnyT/hardnet

https://github.com/PingoLH/Pytorch-HarDNet

hardnet解读:

HardNet解读 - 三年一梦 - 博客园

opencv+python实现图像匹配----模板匹配、特征点匹配_GaoSimin-CSDN博客

模板匹配与特征匹配
模板匹配:模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
特征匹配:所谓特征匹配(FBM),就是指将从影像中提取的特征作为共轭实体,而将所提特征属性或描述参数(实际上是特征的特征,也可以认为是影像的特征)作为匹配实体,通过计算匹配实体之间的相似性测度以实现共轭实体配准的影像匹配方法。在匹配目标发生旋转或大小变化时,该算法依旧有效。
python的版本及依赖的库的安装
#版本python 3.7.1
pip install numpy==1.15.3
pip install matplotlib==3.0.1
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

opencv+python模板匹配1
匹配材料
目标图片:target.jpg

模板图片:template.jpg

模板匹配Template Matching----单目标匹配

#opencv模板匹配----单目标匹配
import cv2
#读取目标图片
target = cv2.imread("target.jpg")
#读取模板图片
template = cv2.imread("template.jpg")
#获得模板图片的高宽尺寸
theight, twidth = template.shape[:2]
#执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
#归一化处理
cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
#寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
#匹配值转换为字符串
#对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置取min_loc
#对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc
strmin_val = str(min_val)
#绘制矩形边框,将匹配区域标注出来
#min_loc:矩形定点
#(min_loc[0]+twidth,min_loc[1]+theight):矩形的宽高
#(0,0,225):矩形的边框颜色;2:矩形边框宽度
cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
#显示结果,并将匹配值显示在标题栏上
cv2.imshow("MatchResult----MatchingValue="+strmin_val,target)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

可以看到显示的min_val的值为0.0,说明完全匹配。

模板匹配Template Matching----多目标匹配
目标图片:target.jpg

#opencv模板匹配----多目标匹配
import cv2
import numpy
#读取目标图片
target = cv2.imread("target.jpg")
#读取模板图片
template = cv2.imread("template.jpg")
#获得模板图片的高宽尺寸
theight, twidth = template.shape[:2]
#执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
#归一化处理
#cv2.normalize( result, result, 0, 1, cv2.NORM_MINMAX, -1 )
#寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
#绘制矩形边框,将匹配区域标注出来
#min_loc:矩形定点
#(min_loc[0]+twidth,min_loc[1]+theight):矩形的宽高
#(0,0,225):矩形的边框颜色;2:矩形边框宽度
cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
#匹配值转换为字符串
#对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置取min_loc
#对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc
strmin_val = str(min_val)
#初始化位置参数
temp_loc = min_loc
other_loc = min_loc
numOfloc = 1
#第一次筛选----规定匹配阈值,将满足阈值的从result中提取出来
#对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法设置匹配阈值为0.01
threshold = 0.01
loc = numpy.where(result<threshold)
#遍历提取出来的位置
for other_loc in zip(*loc[::-1]):#第二次筛选----将位置偏移小于5个像素的结果舍去if (temp_loc[0]+5<other_loc[0])or(temp_loc[1]+5<other_loc[1]):numOfloc = numOfloc + 1temp_loc = other_loccv2.rectangle(target,other_loc,(other_loc[0]+twidth,other_loc[1]+theight),(0,0,225),2)
str_numOfloc = str(numOfloc)
#显示结果,并将匹配值显示在标题栏上
strText = "MatchResult----MatchingValue="+strmin_val+"----NumberOfPosition="+str_numOfloc
cv2.imshow(strText,target)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

opencv+python特征匹配2
匹配材料
目标图片:target.jpg

模板图片:template_adjst.jpg

BFMatching描述特征点–运行结果不精确

#opencv----特征匹配----BFMatching
import cv2
from matplotlib import pyplot as plt
#读取需要特征匹配的两张照片,格式为灰度图。
template=cv2.imread("template_adjust.jpg",0)
target=cv2.imread("target.jpg",0)
orb=cv2.ORB_create()#建立orb特征检测器
kp1,des1=orb.detectAndCompute(template,None)#计算template中的特征点和描述符
kp2,des2=orb.detectAndCompute(target,None) #计算target中的
bf = cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True) #建立匹配关系
mathces=bf.match(des1,des2) #匹配描述符
mathces=sorted(mathces,key=lambda x:x.distance) #据距离来排序
result= cv2.drawMatches(template,kp1,target,kp2,mathces[:40],None,flags=2) #画出匹配关系
plt.imshow(result),plt.show() #matplotlib描绘出来

基于FLANN的匹配器(FLANN based Matcher)描述特征点

'''
基于FLANN的匹配器(FLANN based Matcher)
1.FLANN代表近似最近邻居的快速库。它代表一组经过优化的算法,用于大数据集中的快速最近邻搜索以及高维特征。
2.对于大型数据集,它的工作速度比BFMatcher快。
3.需要传递两个字典来指定要使用的算法及其相关参数等
对于SIFT或SURF等算法,可以用以下方法:
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
对于ORB,可以使用以下参数:
index_params= dict(algorithm = FLANN_INDEX_LSH,
                   table_number = 6, # 12   这个参数是searchParam,指定了索引中的树应该递归遍历的次数。值越高精度越高
                   key_size = 12,     # 20
                   multi_probe_level = 1) #2
'''

import cv2 as cv
from matplotlib import pyplot as plt
queryImage=cv.imread("template_adjust.jpg",0)
trainingImage=cv.imread("target.jpg",0)#读取要匹配的灰度照片
sift=cv.xfeatures2d.SIFT_create()#创建sift检测器
kp1, des1 = sift.detectAndCompute(queryImage,None)
kp2, des2 = sift.detectAndCompute(trainingImage,None)
#设置Flannde参数
FLANN_INDEX_KDTREE=0
indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)
searchParams= dict(checks=50)
flann=cv.FlannBasedMatcher(indexParams,searchParams)
matches=flann.knnMatch(des1,des2,k=2)
#设置好初始匹配值
matchesMask=[[0,0] for i in range (len(matches))]
for i, (m,n) in enumerate(matches):if m.distance< 0.5*n.distance: #舍弃小于0.5的匹配结果matchesMask[i]=[1,0]
drawParams=dict(matchColor=(0,0,255),singlePointColor=(255,0,0),matchesMask=matchesMask,flags=0) #给特征点和匹配的线定义颜色
resultimage=cv.drawMatchesKnn(queryImage,kp1,trainingImage,kp2,matches,None,**drawParams) #画出匹配的结果
plt.imshow(resultimage,),plt.show()

运行结果:

基于FLANN的匹配器(FLANN based Matcher)定位图片
#基于FLANN的匹配器(FLANN based Matcher)定位图片

import numpy as np
import cv2
from matplotlib import pyplot as pltMIN_MATCH_COUNT = 10 #设置最低特征点匹配数量为10
template = cv2.imread('template_adjust.jpg',0) # queryImage
target = cv2.imread('target.jpg',0) # trainImage
# Initiate SIFT detector创建sift检测器
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(template,None)
kp2, des2 = sift.detectAndCompute(target,None)
#创建设置FLANN匹配
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2)
# store all the good matches as per Lowe's ratio test.
good = []
#舍弃大于0.7的匹配
for m,n in matches:if m.distance < 0.7*n.distance:good.append(m)
if len(good)>MIN_MATCH_COUNT:# 获取关键点的坐标src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)#计算变换矩阵和MASKM, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)matchesMask = mask.ravel().tolist()h,w = template.shape# 使用得到的变换矩阵对原图像的四个角进行变换,获得在目标图像上对应的坐标pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)dst = cv2.perspectiveTransform(pts,M)cv2.polylines(target,[np.int32(dst)],True,0,2, cv2.LINE_AA)
else:print( "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT))matchesMask = None
draw_params = dict(matchColor=(0,255,0), singlePointColor=None,matchesMask=matchesMask, flags=2)
result = cv2.drawMatches(template,kp1,target,kp2,good,None,**draw_params)
plt.imshow(result, 'gray')
plt.show()

模板匹配,特征点匹配-全相关推荐

  1. 结合openCV学习DIP之传统图像特征与匹配

    前言 关于图像的预处理部分参考  结合opencv学习DIP​​​​​​​ 概述 该笔记主要是基于DIP理论➕openCV实现,学习该笔记首先要确保通读DIP理论,并由自己的话描述相关知识,并且掌握o ...

  2. 特征点匹配+特征检测方法汇总

    特征点匹配+特征检测方法汇总 特征提取与匹配---SURF:SIFT:ORB:FAST:Harris角点 匹配方法 匹配函数 1. OpenCV提供了两种Matching方式: • Brute-for ...

  3. 基于特征点匹配的自适应目标跟踪算法

    基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...

  4. CoSENT:特征式匹配与交互式匹配有多大差距?

    ©PaperWeekly 原创 · 作者 | 苏剑林 单位 | 追一科技 研究方向 | NLP.神经网络 一般来说,文本匹配有交互式(Interaction-based)和特征式(Representa ...

  5. lsd 特征点匹配代码_OpenCvSharp 通过特征点匹配图片

    现在的手游基本都是重复操作,一个动作要等好久,结束之后继续另一个动作.很麻烦,所以动起了自己写一个游戏辅助的心思. 这个辅助本身没什么难度,就是通过不断的截图,然后从这个截图中找出预先截好的能代表相应 ...

  6. 基于手机信令数据的北京市职住空间分布格局及匹配特征

    1.文章信息 论文题目为<基于手机信令数据的北京市职住空间分布格局及匹配特征>的一篇2020年发表在<地理科学进展>的涉及到手机信令数据处理的文章. 2.摘要 职住空间作为城市 ...

  7. SIFT特征点匹配中KD-tree与Ransac算法的使用

    转自:http://blog.csdn.net/ijuliet/article/details/4471311 Step1:BBF算法,在KD-tree上找KNN.第一步做匹配咯~ 1.什么是KD-t ...

  8. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测

    特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数  ...

  9. 图像配准之特征点匹配的思考

    最近赶时髦,看了一些智能优化算法如蚁群算法,还有机器学习的一些东西,就想着怎么把这些先进的东西用在图像配准中.头脑风暴了一下,觉得在已经检测到两幅图像的特征点的基础上,就如何对它们进行匹配似乎有优化的 ...

最新文章

  1. 使用zerotier让异地设备组局域网
  2. COM和ATL学习方法
  3. 共享一个从字符串转 Lambda 表达式的类(4)
  4. 将图形以PNG格式输出到浏览器或文件
  5. Involved Parties Object ID generation logic
  6. php服务器安装什么操作系统,php 服务器操作系统
  7. xhtml、html与html5的区别
  8. 计算机桌面有浮层,win7电脑桌面便签小工具怎么显示悬浮文字?
  9. 微信小程序自定义屏幕调试
  10. 爬虫python是什么意思_python爬虫是什么? 【黑马程序员】
  11. 单片机外围电路设计之一:电阻
  12. VirtualProtect 3方法 -seh ret-ASLR-dep-Adrenalin Player 2.2.5.3
  13. VBS脚本统计红楼梦中贾宝玉出现的次数
  14. Unity的Dots技术入门
  15. RC串联对RC并联的等效阻抗转换及仿真
  16. 核心交换机相关技术参数详解
  17. WPS加载项是如何实现调用业务系统JS的 WPS通信原理
  18. 认识函数strok()--eg.分解保存读到的IP配置
  19. 阿里六年团队Leader实战秘诀|程序员最重要的八种软技能(找工作/就业生必读)
  20. MongoDB JDBC 基本使用

热门文章

  1. Linux Shell 命令--cut
  2. Android 中加载网络资源时的优化 缓存和异步机制
  3. 视图需要创建类吗_建筑类的职称需要先评初级吗
  4. Python 在定义函数时 为什么默认参数不能放在必选参数前面
  5. html5怎么要文字飘起来,html分享之一个超级炫酷的-404飞起来了
  6. min3d 引擎学习笔记之一
  7. 专题 17 SOCKET并发程序设计
  8. java计算24小时之内_java的系统时间,怎么计算从现在到凌晨还剩下多少时间?
  9. FILO微型计算机,IBM-PC微机组成原理(ppt48)-咨询报告【PPT课件】
  10. php的异常处理,PHP异常处理Exception类