0

Kinect からのカメラ画像といくつかのサンプル画像の間でキーポイントを一致させるために、OpenCV の FlannBasedMatcher を使用しています。cv::Mat画像を処理するために、次のメソッドを作成しました。

cv::SurfFeatureDetector feature_detector;
cv::SurfDescriptorExtractor descriptor_extractor;

// Contains all the information we need about an image
struct ImageInfo
{
  int                       width,
                            height;
  std::vector<cv::KeyPoint> keypoints;
  cv::Mat                   descriptors;
  cv::FlannBasedMatcher     matcher;
};

void ObjectRecognizer::getImageInfo(const cv::Mat& image, ImageInfo& image_info)
{
  image_info.width  = image.cols;
  image_info.height = image.rows;
  // Detect keypoints
  feature_detector.detect(image, image_info.keypoints);
  // Compute descriptors
  descriptor_extractor.compute(image, image_info.keypoints, image_info.descriptors);
  // Train matcher
  std::vector<cv::Mat> descriptor_vector;
  descriptor_vector.push_back(image_info.descriptors);
  image_info.matcher.add(descriptor_vector);
  image_info.matcher.train();
}

このメソッドを呼び出してImageInfo、カメラ画像とサンプル画像の両方から構造体を取得します。

カメラ画像の記述子を使用してマッチャーをトレーニングし、サンプル画像の記述子を使用してメソッドを呼び出すと、すべてが正常に機能します (実行されるだけでなく、カメラ画像内のサンプル画像を実際に検出できるため):

cam_img_info.matcher.knnMatch(sample_info.descriptors, matches, 2);

逆に、サンプルの画像記述子でトレーニングされたマッチャーを使用しようとすると、セグメンテーション エラーが発生します。

sample_info.matcher.knnMatch(cam_img_info.descriptors, matches, 2);

cv::Mat空を使用してトレーニング済みのサンプル記述子と照合すると、完全に正常に実行されます (もちろん、カメラ画像内のオブジェクトを検出することはできません) 。

cv::Mat descs;
sample_info.matcher.knnMatch(descs, matches, 2);

何が問題なのかについてのアイデアはありますか?

4

0 に答える 0