前言:OpenCV中的特征点对象与描述子对象分别由cv2.KeyPoint类与np.array类封装,与之相关的特征点检测与匹配等相关算法的输出、输入亦为cv2.KeyPoint对象与np.array描述子对象。因此,若使用OpenCV封装好的特征点检测与匹配算法不可避免的需要对cv2.KeyPoint对象与描述子对象进行编解码。
解码: 若使用特征点检测算法的输出的具体坐标信息、方向子信息、描述子信息等则需要对cv2.KeyPoint与描述子进行解码。可通用的解码代码如下:
def decode_kd(kp:cv2.KeyPoint, desc:np.array):
kd_tpls = []
for i in range(len(kp)):
temp = {'pt': kp[i].pt,
'size': kp[i].size,
'angle': kp[i].angle,
'response': kp[i].response,
'octave': kp[i].octave,
'class_id': kp[i].class_id,
'desc': desc[i]}
kd_tpls.append(temp)
return kd_tpls
编码:若使用自定义的特征点与自定义的描述子进行OpenCV中匹配算法的调用则需要对自定义的特征点与描述子进行cv2.KeyPoint对象与np.array描述子对象编码(构建)。可通用的编码代码如下:
def encode_kd(kd_tpls:tuple):
kp = []
desc = []
for i in range(len(kd_tpls)):
k_temp = cv2.KeyPoint(x=kd_tpls[i]['pt'][0],
y=kd_tpls[i]['pt'][1],
size=kd_tpls[i]['size'],
angle=kd_tpls[i]['angle'],
response=kd_tpls[i]['response'],
octave=kd_tpls[i]['octave'],
class_id=kd_tpls[i]['class_id'])
d_temp = kd_tpls[i]['desc']
kp.append(k_temp)
desc.append(d_temp)
return kp, np.array(desc)