2

同じ不可解な例外に言及した質問がありますが、最小限の例で明確に質問したいと思います。

次のコードがあります。

  • ファイルからすべての SIFT 記述子をロードします。
  • CV_32F などの記述子を正規化します。

それから:

  • BowTrainer を初期化します (オンラインで見つかった例に基づくコード):

    TermCriteria tc(CV_TERMCRIT_ITER,100,0.001);
    int retries=1;
    int flags=KMEANS_PP_CENTERS;
    BOWKMeansTrainer bow_trainer(dictionary_size, tc, retries, flags);
    

そして最後に:

   vocabulary = bow_trainer.cluster(training_descriptors); 

ここで、training_descriptors1218772 * 1280,1 の正規化された SIFT 記述子を含む CV_32F 行列です。

残念ながらcluster、次のような例外が生成されます。

OpenCV Error: Assertion failed (data.dims <= 2 && type == CV_32F && K > 0) in kmeans, file /Users/u/Downloads/OpenCV-2.4.4/modules/core/src/matrix.cpp, line 2686

行列の型は正しいです。つまり、CV_32F誰の data.dims が <=2 である必要があるのか​​、なぜ K <= 0 のように見えるのかわかりません。

4

1 に答える 1

0

偶然にも、これと同じエラーが発生しました。私の場合、記述子 Mat にゼロ要素が含まれていたためです。これは data.dims <= 2 が参照しているものだと思います。

OpenCV Error: Assertion failed (data.dims <= 2 && type == CV_32F && K > 0) in kmeans, file /home/ubuntu/opencv-2.4.5/modules/core/src/matrix.cpp, line 2686

記述子の配列が空でないことを確認しましたか?

于 2014-02-20T00:11:19.387 に答える