【问题标题】:JavaCV compute ORB descriptors for SIFT keypointsJavaCV 计算 SIFT 关键点的 ORB 描述符
【发布时间】:2012-07-22 23:43:38
【问题描述】:

我在计算 SIFT 检测器找到的关键点的 ORB 描述符时遇到了很大的问题。如果我尝试运行一个简单的示例程序,整个系统就会冻结,我不知道为什么。示例代码如下:

import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImageM;

import com.googlecode.javacv.cpp.opencv_core.CvMat;
import com.googlecode.javacv.cpp.opencv_features2d.DescriptorExtractor;
import com.googlecode.javacv.cpp.opencv_features2d.FeatureDetector;
import com.googlecode.javacv.cpp.opencv_features2d.KeyPoint;
import com.googlecode.javacv.cpp.opencv_features2d.ORB;
import com.googlecode.javacv.cpp.opencv_nonfree.SIFT;

public class DescriptorTest {

    public static void main(String[] args) {
        SIFT sift = new SIFT(0, 3, 0.04, 10, 1.6);
        FeatureDetector detector = sift.getFeatureDetector();
        ORB orb_descriptor = new ORB(500, 1.2f, 8, 31, 0, 2, 0, 31);
        DescriptorExtractor descriptor = orb_descriptor.getDescriptorExtractor();        
        CvMat image = cvLoadImageM("res/dvd_009_ref.jpg");
        KeyPoint keypoints = new KeyPoint();
        CvMat descriptors = new CvMat(null);
        detector.detect(image, keypoints, null);
        System.out.println("Keypoints found: "+ keypoints.capacity());
        descriptor.compute(image, keypoints, descriptors);
        System.out.println("Descriptors calculated: "+descriptors.rows());
    }
}

有人知道问题出在哪里吗?会很棒:)

【问题讨论】:

    标签: opencv sift javacv orb


    【解决方案1】:

    好的,所以如果我将关键点的八度音阶设置为 0,它似乎可以工作。我还不知道这是否是个好主意,但我倾向于拒绝。因为对于某些描述符来说,发现特征的尺度空间倍频程的信息是至关重要的。

    for(int i = 0; i < keypoints.capacity(); i++) {
        KeyPoint kp = keypoints.position(i);
        kp.octave(0);
    }
    keypoints.position(0);
    

    【讨论】:

      【解决方案2】:

      我不知道这是否对您有帮助,您可能想查看 Vladislav Vinogradov (http://code.opencv.org/users/340) 提供的解决方法 (http://code.opencv.org/issues/2987)。虽然这是一个 c++ 代码,但我相信你会明白的:

      void unpackSIFTOctave(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);
      }
      

      这是一段时间以来的已知问题,他们似乎不打算修复它。

      (是的,您可能希望保留关键点的数据,因为描述提取过程可能会使用这些数据来保持缩放/旋转不变,并且八度音程信息通常与关键点的“本地”描述性有关,并且)

      希望这会有所帮助,(并且不需要再次编辑:))

      V

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-19
        • 2012-10-06
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        相关资源
        最近更新 更多