2015-04-28 15 views
3

извлечь descriptors, а затем сохранить их в файл, как это:opecv C++ соответствующих дескрипторов из файла

detector->detect(img, imgKpts); 
extractor->compute(img, imgKpts, imgMat); 
fsKpts << filename << imgMat; 

, но когда я read их обратно, как это:

std::vector<cv::Mat> filesDVec; 
cv::Mat temp; 
fs[filename] >> temp; 
filesDVec.push_back(temp); 

и match в descriptors с На фотографии:

с th е 2 cv::Mat с этим способом раунда:

matcher->match(filesDVec[i], givenInMat, matchesVector); 

A.K.A match(Scene, Object, ...) выхода: minDist = 100 maxDist = 0 (ни одного матча).

Но с ними таким образом раунд:

matcher->match(givenInMat, filesDVec[i], matchesVector); 

AKA match(Object, Scene, ...) брошена эта ошибка:

opencv error:assertion failed (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type = CV_8U)) in void cv::batchDistance 

Я хочу иметь описательную информацию из каждого изображения сохраненную таким образом он может быть загружен в, Что я делаю не так?

Редактировать

Я хотел бы добавить, что это не тот случай, чтобы пытаться соответствовать и изображение само по себе, как известно, что matcher не работает, если объект и исходное изображение одинаковы для целей тестирования.

Edit 2

Содержание файла:

Image_0: !!opencv-matrix 
    rows: 315 
    cols: 32 
    dt: u 
    data: [ 0, 128, 196, 159, 108, 136, 172, 39, 188, 3, 114, 16, 172, 
     234, 0, 66, 74, 43, 46, 128, 64, 172, 67, 239, 4, 54, 218, 8, 84, 
     0, 225, 136, 160, 133, 68, 155, 204, 136, 232, 47, 61, 17, 115, 
     18, 236, 106, 8, 81, 107, 131, 46, 128, 114, 56, 67, 213, 12, 50, 
     218, 64, 21, 8, 209, 136, 180, 69, 70, 142, 28, 130, 238, 96, 141, 
     128, 243, 2, 74, 74, 37, 65, 120, 161, 78, 226, 104, 163, 0, 204, 
... 
etc 

Read:

std::vector<cv::Mat> filesDVec(imgVec.size()); 
cv::Mat temp; 
cv::FileStorage fs("tileDesc.yml", cv::FileStorage::READ); 
for(size_t i = 0; i < (imgVec.size()); i++){ 
    cv::string iValue = std::to_string(i); 
    cv::string filename = "Image_" + iValue; 
    fs[filename] >> temp; 
    filesDVec.push_back(temp); 
} 
fs.release(); 
+0

Две ошибки из 'matcher-> match' подразумевают, что' filesDVec [i] ', вероятно, является пустым Mat. Убедитесь, что 'fs [filename] >> temp;' читает указанный вами файл. – mcchu

+0

Я проверил, да. – MLMLTL

ответ

1

Проблема в том, что вы выделить и построить filesDVec с imgVec.size() элементов (они являются пустыми cv::Mat s). Затем каждый дескриптор (вы загружаете цикл for) будет добавлен в конце вектора filesDVec.

В результате этого вы пытаетесь сопоставить некоторые пустые cv::Mat с givenInMat и, скорее всего, это приведет к сбою приложения или утверждению. Попробуйте прочитать его, как показано ниже:

std::vector<cv::Mat> filesDVec; 
cv::Mat temp; 
cv::FileStorage fs("tileDesc.yml", cv::FileStorage::READ); 

for(size_t i = 0; i < (imgVec.size()); i++){ 
    cv::string iValue = std::to_string(i); 
    cv::string filename = "Image_" + iValue; 
    fs[filename] >> temp; 
    filesDVec.push_back(temp); 
} 

fs.release(); 
0

ли вы открыть файл в режиме чтения? В противном случае opencv очистит файл перед его чтением.

FileStorage fsKpts(filename, FileStorage::READ); 
fsKpts[filename] >> temp; 

Вместо

FileStorage fsKpts(filename, FileStorage::WRITE); 
+0

Я знаю, как работает «FileStorage», см. Мое редактирование – MLMLTL