Я извлекаю descriptors
и затем сохраните их в файл следующим образом:
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
с загруженным изображением:
cv::Mat givenIn, givenInMat;
givenIn = cv::imread(dataDirGivenIn, CV_LOAD_IMAGE_GRAYSCALE);
cv::vector<cv::KeyPoint> givenInKpts;
detector->detect(givenIn, givenInKpts);
extractor->compute(givenIn, givenInKpts, givenInMat);
cv::vector<cv::DMatch> matchesVector;
с 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);
A.K.A 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
не работает, если объект и исходное изображение равны для целей тестирования.
Редактировать 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
Читать:
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();
Проблема в том, что вы выделяете и строите filesDVec
с imgVec.size()
элементы (они пусты cv::Mat
с). Затем каждый дескриптор (вы загружаете в 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();
Вы открывали файл в режиме чтения? В противном случае opencv очистит файл перед чтением.
FileStorage fsKpts(filename, FileStorage::READ);
fsKpts[filename] >> temp;
Вместо
FileStorage fsKpts(filename, FileStorage::WRITE);