opencv 中sift 的使用

opencv 中Algorithm 封裝了很多算法,實驗過程中,發現sift,surf等在nonfree模塊中的代碼,需要initModule_nonfree();來註冊算法,不然create 會返回空指針,這在opencv文檔中有介紹。

Ptr<Feature2D> sift = Algorithm::create<Feature2D>("Feature2D.FAST");

對於上面這樣的代碼雖然可以通過編譯,但是沒有意義,因爲Feature2D 僅有的操作是detect and compute,而Fast 僅僅實現了detect,因此運行時會出錯,但是不知道爲什麼opencv 讓Feature2D.FAST 繼承了 Feature2D.

實際上應該這樣用:

Ptr<FeatureDetector> Fast_detect = Algorithm::create<FeatureDetector>("Feature2D.FAST");


一些測試代碼:

#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/nonfree/features2d.hpp>
using namespace std;
using namespace cv;

void main()
{
Mat image = imread("f:\\fruits.jpg");
Mat descriptors;
vector<KeyPoint> keypoints;
initModule_nonfree();
Ptr<Feature2D> sift = Algorithm::create<Feature2D>("Feature2D.SIFT");
(*sift)(image, noArray(), keypoints, descriptors);
Ptr<FeatureDetector> Fast_detect = Algorithm::create<FeatureDetector>("Feat ure2D.FAST");
//Ptr<DescriptorExtractor> Fast_extract = Algorithm::create<Feature2D>("Featur e2D.FAST");
//Fast_detect->detect(image,keypoints);
//Fast_extract->compute(img,kepoints,descriptors);
drawKeypoints(image, keypoints, image, Scalar(255,0,0),4);
imshow("test", image);
waitKey();

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章