OpenCV KeyPoint与描述子编解码

前言: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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值