JavaCV вычисляет дескрипторы ORB для ключевых точек SIFT

У меня большие проблемы с вычислением дескрипторов ORB для ключевых точек, найденных детектором SIFT. Если я попытаюсь запустить простую примерную программу, вся система зависнет, и я не могу понять, почему. Пример кода выглядит следующим образом:

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

Кто-нибудь знает, в чем проблема? Было бы замечательно :)


person hans    schedule 24.07.2012    source источник


Ответы (2)


Итак, похоже, это сработает, если я установлю октаву ключевых точек на 0. Я пока не знаю, хорошая ли это идея, но я склонен говорить нет. Поскольку для некоторых дескрипторов жизненно важна информация об октаве масштабного пространства, в которой обнаружен признак.

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

Я не знаю, будет ли это полезно для вас или нет, вы можете проверить обходной путь, приведенный здесь ( http://code.opencv.org/issues/2987 ) Владислава Виноградова (http://code.opencv.org/users/340). Хотя это код С++, я уверен, что вы поняли идею:

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

person Community    schedule 18.04.2014