1

だから、私はいくつかのSURFキーポイントを抽出しようとしていますが、これらのキーポイントを押し付けたいです! そこで、最後のパラメーターを「true」、つまり「useProvidedKeypoints」に設定しました。

また、キーポイントを作成するときは、デフォルトのコンストラクターを使用しました (そのため、いくつかのデフォルト値があります)。ポイント「pt」と3に設定したオクターブのみを変更します。

SURF で C++ インターフェイスを使用しています。しかし、デバッグを支援するために私のコードのその部分をコピーしたので、問題が cvExtractSURF にあることはわかっています。

最後のパラメーターを true に設定してその関数を呼び出すと、次のエラーが発生しました。

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /home/widgg/opencv/trunk/modules/core/src/matrix.cpp, line 651
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/widgg/opencv/trunk/modules/core/src/matrix.cpp:651: error: (-5) Unknown array type in function cvarrToMat

何が間違っているのか本当にわかりません!

編集:

ここにいくつかのコードがあります。最初にキーポイントを作成する方法 (layer_id などの情報をいくつか残しましたが、主なアイデアはわかります):

for (json_pt_info_vector::iterator b_beg = beg->points.begin(); b_beg != b_end; ++b_beg)
{
  int layer_id = b_beg->layer_id;
  json_point_info_coord &jpic = b_beg->coord;

  jpic.feature_id = features[layer_id].keypoints.size();
  KeyPoint kp;
  kp.octave = 3;
  kp.pt.x = jpic.x;
  kp.pt.y = jpic.y;
  features[layer_id].keypoints.push_back(kp);
}

SURF の呼び出しは次のとおりです。

SURF surf(300, 3, 4);
for (int i = 0; i < nb_img; ++i)
{
  debug_msg("extract_features #4.1");
  cv::detail::ImageFeatures &cdif = features[i];
  Mat gray_image = imread(param.layer_images[i], 0);  // 0 = force to gray scale!

  debug_msg("extract_features #4.2");
  vector<float> descriptors;
  debug_msg("extract_features #4.3");
  surf(gray_image, Mat(), cdif.keypoints, descriptors, true); // MUST BE TRUE TO FORCE THE PROVIDED KEYPOINTS

  debug_msg("extract_features #4.4");
  cdif.descriptors = Mat(descriptors, true).reshape(1, (int)cdif.keypoints.size());
  debug_msg("extract_features #4.5");
  gray_image.release();

  debug_msg("extract_features #4.6");
  images[i] = imread(param.layer_images[i]);  // keep the image open
}

デバッグ メッセージの #4.3 の後にクラッシュします。

それが役立つことを願っています!

編集2:

一部を cv::SurfDescriptorExtracter に置き換えました。4.3 から 4.5 までのすべてを次の行に置き換えます。

 extractor.compute(gray_image, cdif.keypoints, cdif.descriptors);

さて、まだバグがありますが、それは別の場所にあり、この質問に関連する必要はありません!

4

1 に答える 1

0

surf(gray_image, Mat(), cdif.keypoints, descriptors, true)even への呼び出しがコンパイルされることに驚いています。引数はdescriptorsベクトルではなく cv::Mat でなければなりません。

于 2012-08-02T09:20:05.453 に答える