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>