Я хочу получить минимальный рабочий пример реализации программы FABMAP OpenCV. Чтобы туда добраться, я скопировал код с this file. Я использую другую версию OpenCV, чем поставщик образца кода (в моем случае это 2.4.8) и должны были изменить первоначальную линиюОшибка сегментации в OpenCV MWE
Ptr<DescriptorExtractor> extractor =
new SurfDescriptorExtractor(1000, 4, 2, false, true);
в
Ptr<DescriptorExtractor> extractor =
DescriptorExtractor::create("SURF");
К сожалению, сейчас я получаю ошибка сегментации, которую я не могу решить (я прокомментировал строку). Кроме того, я обнаружил, что extractor
является нулевым указателем, тогда как matcher
- нет. Может ли быть, что nullpointer extractor
вызывает проблемы? Как я могу решить эту ситуацию?
Я использую Ubuntu 14.04 и g ++ для компиляции (C++ 11).
Чтобы воспроизвести это, вам необходимо скачать this directory. Мой минимальный (почти) рабочий пример:
#include "opencv2/opencv.hpp"
#include "opencv2/features2d/features2d.hpp"
using namespace cv;
using namespace std;
int main(int argc, char * argv[]) {
string dataDir = "fabmap_data/";
FileStorage fs;
//load/generate vocabulary
fs.open(dataDir + string("vocab_small.yml"), FileStorage::READ);
Mat vocab;
fs["Vocabulary"] >> vocab;
fs.release();
//generate test data
Ptr<FeatureDetector> detector =
new DynamicAdaptedFeatureDetector(
AdjusterAdapter::create("STAR"), 130, 150, 5);
Ptr<DescriptorExtractor> extractor =
DescriptorExtractor::create("SURF"); // extractor seems to be a nullpointer (addres:: 0x0)
Ptr<DescriptorMatcher> matcher =
DescriptorMatcher::create("FlannBased");
BOWImgDescriptorExtractor bide(extractor, matcher);
bide.setVocabulary(vocab);
string imageName = "stlucia_test_small0000.jpeg";
Mat frame;
Mat bow;
vector<KeyPoint> kpts;
frame = imread(dataDir + imageName);
detector->detect(frame, kpts);
bide.compute(frame, kpts, bow); // I get a segmentation fault at this line!
return 0;
}
Ну да ладно. Сколько часов я потратил впустую ... Спасибо! – MrX