Каков правильный тип вывода дескрипторов SIFT в OpenCV?
Я спрашиваю это, потому что я знаю, что это Поплавок / двойной, но когда я пытаюсь сохранить дескрипторы в файл, он сохраняет некоторые ИНТ ценности…
Мой код:
cv::Mat img;
std::vector<cv::KeyPoint> imgKeypoints;
cv::Mat imgDescriptors;
cv::DescriptorExtractor *extractor;
cv::FeatureDetector *detector;
img = cv::imread(this->imageFileName.c_str(), cv::IMREAD_GRAYSCALE);
detector = new cv::DenseFeatureDetector(15.0, 1, 0.1, 6, 0, true, false);
extractor = new cv::SIFT(0, 3, 0.04, 10.0, 1.6);
extractor->compute(this->img, this->imgKeypoints, this->imgDescriptors);
std::ofstream fout(outputFile.data());
//I need to save it on this specified format
for (int i = 0; i < this->imgDescriptors.rows; i++)
{
for (int j = 0; j < this->imgDescriptors.cols; j++)
fout << " " << float(this->imgDescriptors.at<float>(i,j));
}
Выходной файл выглядит так:
0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 2 3 10 13 10 1 1 0 24 5 2 3 5 1 0 5 0 0 0 0 0 0 0 0 3 3 7 4 2 1 2 2 23 13 27 30 35 19 21 35 96 16 15 35 43 12 9 123 0 0 0 0 0 0 0 0 5 1 1 2 2 4 7 7 45 8 27 66 27 17 41 127 57 18 82 100 67 14 16 90 0 0 0 0 0 0 0 0 6 0 1 17 9 1 2 30 143 26 50 168 168 4 5 107 168 58 86 168 74 14 5 54
Они все ИНТ ценности, верно? Это правильно??? Не должно ли это быть поплавок?
Вот Это Да! Я получил ответ от другого вопроса: Как SiftDescriptorExtractor из OpenCV преобразует значения дескриптора?
Это связано с тем, что классические реализации SIFT позволяют квантовать нормализованные
значения с плавающей запятой в целое число без знака через 512
множитель, который эквивалентен, чтобы считать, что любой SIFT
Компонент варьируется между [0, 1/2], и, таким образом, избежать потери точности
пытаясь закодировать полный диапазон [0, 1].
Извините за дублирование … = S