2012-07-24 6 views
2

SIFT 탐지기에서 찾은 키포인트에 대한 ORB 설명자를 계산할 때 큰 문제가 있습니다. 간단한 예제 프로그램을 실행하려고하면 전체 시스템이 멈추고 이유를 파악할 수 없습니다. 샘플 코드는 다음과 같습니다.JavaCV는 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()); 
    } 
} 

누구에게 어떤 문제가 있습니까? 위대한 것입니다 :)

답변

1

좋아, 그래서 내가 키포드의 옥타브를 0으로 설정하면 작동하는 것 같습니다. 나는 이것이 좋은 생각인지 아직 모르겠지만 아니오라고 대답하는 경향이 있습니다. 일부 설명자의 경우 해당 기능이 발견 된 스케일 - 공간 옥타브의 정보가 중요합니다.

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

나는이 당신을 위해 도움이 될 것입니다 여부를 모르거나하지 당신은 블라디슬라프 비노그라도프에 의해 여기 (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); 
} 

이 잠시 동안 알려진 문제이며 그들은 그것을 해결하기 위해 계획해야하지 않는 것 : 이것은 C++ 코드입니다하지만 난 당신이 아이디어를 얻을 것이다 확신합니다.

(그래 당신은 설명 추출 절차는 불변 규모/회전 수들을 사용 정보는 일반적으로 "로컬"키포인트는 설명적인 방법과 관련이 옥타브와 수 있기 때문에 키포인트의 자료를 유지 할 수 있습니다)이 도움이

희망 (다시 편집 할 필요가 없습니다 :))

V