2012-07-24 126 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