2

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

問題が何であるかを知っている人はいますか?素晴らしいことだ :)

4

2 に答える 2

1

わかりました。キーポイントのオクターブを 0 に設定するとうまくいくようです。これが良いアイデアかどうかはまだわかりませんが、いいえと言う傾向があります。一部の記述子では、特徴が見つかったスケール空間オクターブの情報が重要です。

for(int i = 0; i < keypoints.capacity(); i++) {
    KeyPoint kp = keypoints.position(i);
    kp.octave(0);
}
keypoints.position(0);
于 2012-08-03T16:48:18.337 に答える
1

これがあなたにとって役立つかどうかはわかりませんが Vladislav Vinogradov ( 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);
}

これはしばらくの間既知の問題であり、修正する予定はないようです。

(そして、キーポイントのデータムを保持したい場合があります。これは、説明抽出手順でそれらをスケール/回転不変にするために使用する場合があり、オクターブ情報は通常、キーポイントがどの程度「ローカルに」記述的であるかに関連しているからです)

これが役に立てば幸いです(再度編集する必要はありません:))

于 2014-04-18T06:18:05.977 に答える