2012-07-24 56 views
2

我在計算SIFT檢測器找到的關鍵點的ORB描述符時遇到很大問題。如果我嘗試運行一個簡單的示例程序,整個系統都會凍結,我無法弄清楚原因。示例代碼如下:用於SIFT關鍵點的JavaCV計算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)一種解決方法。雖然這是一個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