【问题标题】:Well distributed features using Opencv使用 Opencv 分布良好的功能
【发布时间】:2012-02-09 11:58:04
【问题描述】:

我正在尝试在视频序列的两帧之间找到匹配项(没有大动作,只是一步),我使用了 SURF 和 FAST 功能以及蛮力匹配器,结果很好,但我需要的是得到“好”分布式特征,我查了一下,发现在 Szeliski 书中有一个叫做 Adaptive non-maximal suppression 的东西确实可以做到,那么在 opencv 中有没有这样做的东西,我希望匹配器在一个小窗口中查找匹配项,无需扫描所有描述符。

【问题讨论】:

  • 更适合dsp.stackexchange
  • 问题是什么?

标签: c++ opencv computer-vision


【解决方案1】:

最近有一篇论文"Efficient adaptive non-maximal suppression algorithms for homogeneous spatial keypoint distribution" 解决了图像上的均匀关键点分布问题。此repository 中提供了 C++、Python 和 Matlab 接口。它可以毫不费力地包含在您的 c++ 代码中,并与通过 OpenCV 派生的关键点一起工作。

【讨论】:

    【解决方案2】:

    这是我为基于 KD-Tree 的局部非最大特征抑制编写的一个简单的 Python 实现。它假设 kps 是一组 opencv 2d 稀疏特征(SIFT、SURF、AKAZE 等)。 它根据(降序)分数对特征进行排序,然后按分数顺序开始查询它们,从集合中删除高分特征的邻居(并避免它们未来的查询以提高效率)

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

    from scipy.spatial.kdtree import KDTree
    import numpy as np
    
    def KDT_NMS(kps, descs=None, 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
        neg_responses = [-kp.response for kp in kps]
        order = np.argsort(neg_responses)
        kps = np.array(kps)[order].tolist()
    
        # create kd-tree for quick NN queries
        data = np.array([list(kp.pt) for kp in kps])
        kd_tree = KDTree(data)
    
        # perform NMS using kd-tree, by querying points by score order, 
        # and removing neighbors from future queries
        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(kps) if i not in removed]
        descs_filtered = None
        if descs is not None:
            descs = descs[order]
            descs_filtered = np.array([desc for i,desc in enumerate(descs) if i not in removed],dtype=np.float32)
        print('Filtered',len(kp_filtered),'of',N)
        return kp_filtered, descs_filtered
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多