2 votes

JavaCV calcule les descripteurs ORB pour les points clés SIFT

J'ai de gros problèmes pour calculer les descripteurs ORB pour les points clés trouvés par le détecteur SIFT. Si j'essaie d'exécuter un programme d'exemple simple, tout le système se bloque et je n'arrive pas à comprendre pourquoi. L'exemple de code est le suivant :

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

Quelqu'un a-t-il une idée du problème ? Ce serait génial :)

1voto

jstr Points 664

Je ne sais pas encore si c'est une bonne idée mais j'ai tendance à dire non. Car pour certains descripteurs, l'information de l'octave de l'espace d'échelle dans lequel la caractéristique a été trouvée est vitale.

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

1voto

Je ne sais pas si cela vous sera utile ou non, vous pouvez vérifier une solution de contournement donnée ici ( http://code.opencv.org/issues/2987 ) par Vladislav Vinogradov ( http://code.opencv.org/users/340 ). Bien qu'il s'agisse d'un code c++, je suis sûr que vous comprendrez l'idée :

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

C'est un problème connu depuis un certain temps et ils ne semblent pas avoir l'intention de le résoudre.

(et oui, vous pouvez vouloir conserver les données du point clé car les procédures d'extraction de description peuvent les utiliser pour être invariantes en termes d'échelle et de rotation, et les informations sur les octaves sont généralement liées à la description "locale" d'un point clé).

J'espère que cela vous aidera (et qu'il ne sera pas nécessaire de le modifier à nouveau :) ).

V

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X