OpenCV (Python) 解压 SIFT Octave

Fur*_*rin 4 python opencv sift

我刚刚发现 SIFT 将八度写入打包值(八度、图层和比例)。
我需要解压这个值,因为我必须将 SIFT 检测器与其他描述符(ORB、BRIEF、SURF、BRISK)结合使用。在这里您可以找到类似的问题。
我已经尝试了不同的解决方案(参见下面的代码),但似乎没有一个在 python 中工作(这个也是如此)。
有什么建议吗?

unpackOctave(keypoints[i], octave, layer, scale)     
Run Code Online (Sandbox Code Playgroud)

或者:

unpackOctave(const KeyPoint& kpt, int& octave, int& layer, float& scale){    
    octave = kpt.octave & 255;    
    layer = (kpt.octave >> 8) & 255;    
    octave = octave < 128 ? octave : (-128 | octave);    
    scale = octave >= 0 ? 1.f/(1 << octave) : (float)(1 << -octave);    
}
Run Code Online (Sandbox Code Playgroud)

Kin*_*t 金 5

我定义了一个 Python 函数来解压 SIFT Octave:

#!/usr/bin/python3
## 2018.01.23 11:12:30 CST
## created by Silencer

def unpackSIFTOctave(kpt):
    """unpackSIFTOctave(kpt)->(octave,layer,scale)
    @created by Silencer at 2018.01.23 11:12:30 CST
    @brief Unpack Sift Keypoint by Silencer
    @param kpt: cv2.KeyPoint (of SIFT)
    """
    _octave = kpt.octave
    octave = _octave&0xFF
    layer  = (_octave>>8)&0xFF
    if octave>=128:
        octave |= -128
    if octave>=0:
        scale = float(1/(1<<octave))
    else:
        scale = float(1<<-octave)
    return (octave, layer, scale)
Run Code Online (Sandbox Code Playgroud)

例如,我检测熊猫上的筛选 kpts。

在此输入图像描述

用于unpackSiftOctave解压 sift kpts,获取(八度、图层、音阶)列表。解压结果的一部分。

[(0, 3, 1.0),
 (1, 3, 0.5),
 (-1, 3, 2.0),
 (-1, 3, 2.0),
 (2, 1, 0.25),
 (2, 1, 0.25),
 (-1, 1, 2.0),
 (-1, 1, 2.0),
 (0, 2, 1.0),
 (1, 3, 0.5),
 ...
]
Run Code Online (Sandbox Code Playgroud)

  • @RachitBhargava `2^octave * scale = 1`。octave = -1,scale = 2,调整大小2x。 (3认同)