我正在使用OpenCV的FlannBasedMatcher来匹配来自Kinect的相机图像和一些样本图像之间的关键点。我编写了以下方法来处理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);
关于可能出现什么问题的任何想法?