3

Bag of Visual words を構築するために、さまざまなポイント記述子 (SIFT、SURF、ORB、BRIEF など) を抽出しようとしています。問題は、12x60px という非常に小さな画像を使用していることにあるようです。高密度エクストラクタを使用すると、いくつかのキーポイントを取得できますが、記述子を抽出するときにデータが抽出されません。

コードは次のとおりです。

vector<KeyPoint> points;
Mat descriptor; // descriptor of the current image
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("BRIEF");
Ptr<FeatureDetector> detector(new DenseFeatureDetector(1.f,1,0.1f,6,0,true,false));
image = imread(filename, 0);
roi = Mat(image,Rect(0,0,12,60));

detector->detect(roi,points);

extractor->compute(roi,points,descriptor);
cout << descriptor << endl;

結果は [] (BRIEF と ORB を使用) および SegFault (SURF と SIFT を使用) です。OpenCV の小さな画像からポイント記述子を密に抽出する方法についての手がかりを持っている人はいますか? ご協力いただきありがとうございます。

4

2 に答える 2

2

実際、私は最終的に解決に向けて努力することができました。助けてくれてありがとう。

現在、ランダムなパラメーターではなく、初期化されたパラメーターを持つ Orb 検出器を使用しています。

Ptr<DescriptorExtractor> extractor(new ORB(500, 1.2f, 8, orbSize, 0, 2, ORB::HARRIS_SCORE, orbSize));

私の問題に対する答えを見つける前に、OpenCV のドキュメントを徹底的に調べなければなりませんでした: Orb のドキュメントです。

また、密点抽出器を使用している場合は、記述子計算プロセスの後、キーポイント抽出器によって生成されたキーポイントよりも少ないキーポイントがある可能性があることに注意する必要があります。ディスクリプタの計算では、データを取得できないキーポイントが削除されます。

于 2013-10-29T12:28:18.767 に答える
1

BRIEF と ORB は、32x32 パッチを使用して記述子を取得します。イメージに合わないため、それらのキーポイントは削除されます (記述子なしでキーポイントが返されるのを避けるため)。

SURF と SIFT の場合、より小さなパッチを使用できますが、キーポイントによって提供されるスケールに依存します。この場合、より大きなパッチを使用する必要があり、以前と同じことが起こると思います。ただし、セグメンテーション違反が発生する理由はわかりません。おそらく、SIFT/SURF 記述子エクストラクタは、BRIEFT/ORB のものとは異なり、キーポイントが画像の境界内にあることをチェックしません。

于 2013-10-28T11:30:54.133 に答える