smc路由器-百度首页导航

索引图像
2023年4月7日发(作者:爱奇艺下载安装免费)

图像处理之图像特征匹配

在本章中,-我们将看到如何将⼀个图像中的特征与其他图像进⾏匹配。-我们将在OpenCV中使⽤Brute-Force匹配器和FLANN匹配器

⼀、Brute-Force匹配器

它使⽤第⼀组中⼀个特征的描述符,并使⽤⼀些距离计算将其与第⼆组中的所有其他特征匹配。并返回最接近的⼀个。

对于BF匹配器,⾸先我们必须使⽤her()创建BFMatcher对象。它需要两个可选参数。第⼀个是normType,它指定要使⽤的

距离测量。默认情况下为_L2。对于SIFT,SURF等(也有_L1)很有⽤。对于基于⼆进制字符串的描述符,例如

ORB,BRIEF,BRISK等,应使⽤_HAMMING,该函数使⽤汉明距离作为度量。如果ORB使⽤WTA_K==3或4,则应使⽤

_HAMMING2。

第⼆个参数是布尔变量,即crossCheck,默认情况下为false。如果为true,则Matcher仅返回具有值(i,j)的那些匹配项,以使集合A中的

第i个描述符具有集合B中的第j个描述符为最佳匹配,反之亦然。即两组中的两个特征应彼此匹配。它提供了⼀致的结果,并且是在

SIFT论⽂中提出的⽐率测试的良好替代⽅案。

创建之后,两个重要的⽅法是()和ch()。第⼀个返回最佳匹配。第⼆种⽅法返回k个最佳匹配,其中

k由⽤户指定。当我们需要对此做其他⼯作时,它可能会很有⽤。

就像我们使⽤ypoints()绘制关键点⼀样,tches()可以帮助我们绘制匹配项。它⽔平堆叠两张图像,并绘制从第⼀张

图像到第⼆张图像的线,以显⽰最佳匹配。还有tchesKnn绘制所有k个最佳匹配。如果k=2,它将为每个关键点绘制两条匹配

线。因此,如果要选择性地绘制,则必须通过掩码。

使⽤ORB描述符进⾏Brute-Force匹配

在这⾥,我们将看到⼀个有关如何在两个图像之间匹配特征的简单⽰例。在这种情况下,我有⼀个queryImage和trainImage。我们将尝试

使⽤特征匹配在trainImage中找到queryImage。(图像是/samples/data/和/samples/data/box_in_)

我们正在使⽤ORB描述符来匹配特征。因此,让我们从加载图像,查找描述符等开始。

importnumpyasnp

importcv2ascv

asplt

img1=('',_GRAYSCALE)#索引图像

img2=('box_in_',_GRAYSCALE)#训练图像

#初始化ORB检测器

orb=_create()

#基于ORB找到关键点和检测器

kp1,des1=AndCompute(img1,None)

kp2,des2=AndCompute(img2,None)

接下来,我们创建⼀个距离测量值为_HAMMING的BFMatcher对象(因为我们使⽤的是ORB),并且启⽤了CrossCheck以获

得更好的结果。然后,我们使⽤()⽅法来获取两个图像中的最佳匹配。我们按照距离的升序对它们进⾏排序,以使最佳匹配

(低距离)排在前⾯。然后我们只抽出前10的匹配(只是为了提⾼可见度。您可以根据需要增加它)

#创建BF匹配器的对象

bf=her(_HAMMING,crossCheck=True)#匹配描述符.

matches=(des1,des2)#根据距离排序

matches=sorted(matches,key=lambdax:ce)#绘制前10的匹配项

img3=tches(img1,kp1,img2,kp2,matches[:10],None,flags=tchesFlags_NOT_DRAW_SINGLE_POINTS)(img3),()

运⾏结果:

什么是Matcher对象?

matchs=(des1,des2)⾏的结果是DMatch对象的列表。该DMatch对象具有以下属性:-ce-描述符之间的距

离。越低越好。-dx-⽕车描述符中的描述符索引-dx-查询描述符中的描述符索引--⽕车

图像的索引。

⼆、带有SIFT描述符和⽐例测试的Brute-Force匹配

这次,我们将使⽤ch()获得k个最佳匹配。在此⽰例中,我们将k=2,以便可以应⽤在他的论⽂中阐述的⽐例

测试。

importnumpyasnp

importcv2ascv

asplt

img1=('',_GRAYSCALE)#索引图像

img2=('box_in_',_GRAYSCALE)#训练图像

#初始化SIFT描述符

sift=_create()

#基于SIFT找到关键点和描述符

kp1,des1=AndCompute(img1,None)

kp2,des2=AndCompute(img2,None)

#默认参数初始化BF匹配器

bf=her()

matches=ch(des1,des2,k=2)

#应⽤⽐例测试

good=[]

form,ninmatches:

ce<0.75*ce:

([m])

#tchesKnn将列表作为匹配项。

img3=tchesKnn(img1,kp1,img2,kp2,good,None,flags=tchesFlags_NOT_DRAW_SINGLE_POINTS)

(img3),()

查看结果:

三、基于匹配器的FLANN

FLANN是近似最近邻的快速库。它包含⼀组算法,这些算法针对⼤型数据集中的快速最近邻搜索和⾼维特征进⾏了优化。对于⼤型数据

集,它的运⾏速度⽐BFMatcher快。我们将看到第⼆个基于FLANN的匹配器⽰例。

对于基于FLANN的匹配器,我们需要传递两个字典,这些字典指定要使⽤的算法,其相关参数等。第⼀个是IndexParams。对于各种算

法,要传递的信息在FLANN⽂档中进⾏了说明。概括来说,对于SIFT,SURF等算法,您可以通过以下操作:

FLANN_INDEX_KDTREE=1

index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)

使⽤ORB时,你可以参考下⾯。根据⽂档建议使⽤带注释的值,但在某些情况下未提供必需的参数。其他值也可以正常⼯作。

FLANN_INDEX_LSH=6

index_params=dict(algorithm=FLANN_INDEX_LSH,

table_number=6,#12

key_size=12,#20

multi_probe_level=1)#2

第⼆个字典是SearchParams。它指定索引中的树应递归遍历的次数。较⾼的值可提供更好的精度,但也需要更多时间。如果要更改值,请

传递search_params=dict(checks=100)

importnumpyasnp

importcv2ascv

asplt

img1=('',_GRAYSCALE)#索引图像

img2=('box_in_',_GRAYSCALE)#训练图像

#初始化SIFT描述符

sift=_create()

#基于SIFT找到关键点和描述符

kp1,des1=AndCompute(img1,None)

kp2,des2=AndCompute(img2,None)

#FLANN的参数

FLANN_INDEX_KDTREE=1

index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)

search_params=dict(checks=50)#或传递⼀个空字典

flann=asedMatcher(index_params,search_params)

matches=ch(des1,des2,k=2)

#只需要绘制好匹配项,因此创建⼀个掩码

matchesMask=[[0,0]foriinrange(len(matches))]

#根据Lowe的论⽂进⾏⽐例测试

fori,(m,n)inenumerate(matches):

ce<0.7*ce:

matchesMask[i]=[1,0]

draw_params=dict(matchColor=(0,255,0),

singlePointColor=(255,0,0),

matchesMask=matchesMask,

flags=tchesFlags_DEFAULT)

img3=tchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)

(img3,),()

运⾏结果:

更多推荐

索引图像