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);
何が問題なのかについてのアイデアはありますか?