Opencv中特征点Keypoint的解读(特征点与坐标的相互转换)

Opencv中特征点Keypoint的解读

  • 特征点的生成
  • 特征点到坐标的转换
  • 坐标到特征点的转换

在我们学习特征点检测时,使用特征点检测器,比如ORB和SIFT生成特征点(FAST和SURF好像已经申请专利,较新版本可能用不了),通常生成的特征点形式是一个 迭代器,它是 KeyPoint类生成的对象。

特征点的生成

首先我们看看特征点的生成:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#初始化ORB特征点检测器
orb=cv2.ORB_create()
#初始化sift特征点检测器
sift=cv2.xfeatures2d.SIFT_create()
#使用orb检测图片关键点
orb_kp=orb.detect(img)
#使用sift检测图片关键点
sift_kp=sift.detect(newimg)
#画orb关键点
img=cv2.drawKeypoints(img,orb_kp,None,color=[0,0,255])
#画sift关键点
newimg=cv2.drawKeypoints(newimg,sift_kp,None,color=[0,0,255])
#绘图
plt.subplot(121)
plt.title('orbimg')
plt.imshow(img)
plt.subplot(122)
plt.title('siftimg')
plt.imshow(newimg)
plt.show()
print(orb_kp)
print(sift_kp)
print(type(orb_kp[0]))

结果:

(<KeyPoint 000001BC7B2A22A0>, <KeyPoint 000001BC7CFDF1E0>, <KeyPoint 000001BC7CFDFF30>.....) 
<class 'cv2.KeyPoint'>

特征点到坐标的转换

那么如何进行转换呢,由于是KeyPoint的对象,首先可以使用dir()help()进行查看KeyPoint类的属性,比如:

print(dir(orb_kp[0]))
['__class__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'angle',
 'class_id',
 'convert',
 'octave',
 'overlap',
 'pt',
 'response',
 'size']

然后通过访问属性就能打印出相关信息了。其中kp就是特征点的坐标。

print(orb_kp[0].angle)
print(orb_kp[0].class_id)
print(orb_kp[0].convert)
print(orb_kp[0].octave)
print(orb_kp[0].overlap)
print(orb_kp[0].pt)
print(orb_kp[0].response)
print(orb_kp[0].size)
249.6773681640625
-1
<built-in method convert of type object at 0x000001BC30C626D0>
0
<built-in method overlap of type object at 0x000001BC30C626D0>
(164.0, 189.0)
0.0004739729920402169
31.0

我们通过查阅Opencv官方文档也能够查阅出相关资料。
然后还有一钟通过Opencv官方提供的函数进行转换的方法:使用cv2.KeyPoint_convert()函数进行转换。
比如:

kp=cv2.KeyPoint_convert(orb_kp)
print(kp)
[[164.       189.      ]
 [356.       325.      ]
 [100.        36.      ]
 [ 56.       272.      ]
 [111.       283.      ]
 [114.       280.      ]
 [ 60.       276.      ]....]太长了我省略了

如果你这样输入就会出现错误:

kp=cv2.KeyPoint_convert(orb_kp[0])
>  - Can't parse 'keypoints'. Input argument doesn't provide sequence protocol
>  - Can't parse 'points2f'. Input argument doesn't provide sequence protocol

如果想要输出第一个,只能够这样输入:

kp=cv2.KeyPoint_convert(orb_kp,keypointIndexes=[0])
print(kp)
[[164. 189.]]

坐标到特征点的转换

如果先要把坐标变成特征点,可是使用cv2.KeyPoint来创建一个特征点:

kp=cv2.KeyPoint(x=1,y=2,size=3)
print(kp)
<KeyPoint 00000120B1114A80>

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年11月10日
下一篇 2023年11月10日

相关推荐