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)に変換し、私が覚えているので常にそうしています。結果の値が float 記述子に格納されるため、これはスペースの無駄であり、マッチングも妨げます。

私がしているのは、独自のバージョンの SIFT をコンパイルすることで、(リンクで) バイトへの変換を省略しただけで、適切な浮動小数点値が得られます。

于 2013-02-21T08:10:37.393 に答える