0

这是 SIFT 的非常简单的代码,我得到的是非常奇怪的描述符。它们正确吗?

描述符:[0., 7., 29., 39., 11., 0., 0., 0., 32., 30., 39., 52., 16., 0., 1., 12. , 38., 14., 10., 20., 28., 93., 45., 37., 93., 3., 6., 11., 23., 107., 24., 80., 0 ., 2., 47., 53., 0., 1., 9., 8., 104., 85., 35., 41., 1., 10., 32., 19., 130., 73., 0., 0., 8., 76., 31., 42., 61., 40., 10., 5., 83., 130., 28., 31., 3., 0. , 0., 0., 0., 2., 12., 17., 60., 4., 0., 0., 0., 31., 76., 83., 130., 38., 10 ., 6., 15., 10., 16., 89., 19., 21., 16., 23., 130., 94., 7., 3., 1.]

#include "stdafx.h"
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <C:\opencv243\include\opencv2\nonfree\features2d.hpp>
using namespace cv;
using namespace std; 
int main(int argc, const char* argv[])
{
string path="matrices.xml";
   FileStorage fs(path, FileStorage::WRITE);
   cv::siftFeatureDetector detector;
   cv::SiftDescriptorExtractor extractor; 
   cv::Mat descriptors_1;
   std::vector<cv::KeyPoint> keypoints;
   const cv::Mat input=cv::imread("image path",0);
   detector.detect(input, keypoints);
   extractor.compute( input, keypoints, descriptors_1 );
   fs <<"descriptor"<<descriptors_1;
   fs.release();
   return 0;
}
4

1 回答 1

0

出于某种我不知道的原因,OpenCV 中实现的 SIFT 描述符将最终值转换为uchar(0 - 255),并且从我记事起就一直这样做。这是浪费空间,因为结果值存储在浮点描述符中,而且它也阻碍了匹配。

我所做的是编译我自己的 SIFT 版本,我只是省略了到字节的转换(在链接中),我得到了很好的浮点值。

于 2013-02-21T08:10:37.393 回答