使用Opencv分布良好的功能

c++ opencv computer-vision

584 观看

2回复

1943 作者的声誉

我试图在视频序列的两个帧之间找到匹配(没有大的移动只是一步),我使用SURF和FAST功能以及强力匹配器,结果很好,但我需要的是获得“好”的分布式功能,我查了一下,发现在Szeliski的书中有一些叫做自适应非最大抑制的东西完全正确,所以在opencv中有什么东西可以做到这一点,我希望匹配器在一个小窗口中寻找匹配而不需要扫描所有描述符。

作者: Khaled 的来源 发布者: 2012 年 2 月 9 日

回应 (2)


1

75 作者的声誉

最近的一篇论文“用于均匀空间关键点分布的高效自适应非最大抑制算法”解决了图像上均匀关键点分布的问题。该存储库中提供了C ++,Python和Matlab接口。它可以毫不费力地包含在您的c ++代码中,并使用OpenCV派生的关键点。

作者: Alex Bailo 发布者: 10.05.2018 07:35

0

48 作者的声誉

这是我为基于KD-Tree的本地非最大功能抑制编写的一个简单的python实现。它假设kps是opencv 2d稀疏特征的数组(SIFT,SURF,AKAZE等......)。

调整到您想要的空间稀疏度,并根据特征的初始密度调整k_max。

def KDT_NMS(kps, r=15, k_max=20):
    """ Use kd-tree to perform local non-maximum suppression of key-points
    kps - key points obtained by one of openCVs 2d features detectors (SIFT, SURF, 
    AKAZE etc..)
    r - the radius of points to query for removal
    k_max - maximum points retreived in single query
    """
    # sort by score to keep highest score features in each locality
    kps.sort(key=lambda kp: -kp.response)

    # create kd-tree for quick NN queries
    data = np.array([list(kp.pt) for kp in kps])
    kd_tree = KDTree(data)

    N = len(kps)
    removed = set()
    for i in range(N):
        if i in removed:
            continue

        dist, inds = kd_tree.query(data[i,:],k=k_max,distance_upper_bound=r)
        for j in inds: 
            if j>i:
                removed.add(j)

    kp_filtered = [kp for i,kp in enumerate(kp2) if i not in removed]
    print('Filtered',len(kp_filtered),'of',N)
    return kp_filtered
作者: Bambi 发布者: 07.08.2019 08:28
32x32