SiftDescriptorExtractor對應於SIFT算法中特征向量提取的工作,通過他對關鍵點周圍鄰域內的像素分塊進行梯度運算,得到128維的特征向量。具體有如下幾個操作:
0、首先,我們假設在之前關鍵點提取的步驟中,我們對一個三角形提取關鍵點,檢測到其中一個關鍵點的坐標為三角形的一個角(如下面用紅圈圈出的),如下圖
放大看,假設檢測到該關鍵點的方向如下圖:
1、將關鍵點周圍的像素旋轉到一個統一的方向,以保證方向不變性。如下圖
2、將這些像素分成4X4的小塊
對每個格子進行分析,將格子中的像素計算梯度,映射到8個方向上,對於每一個格子,可以得到一個8維的向量,對於一個關鍵點周圍16個格子,則得到了16X8=128維的向量,這就是一個關鍵點特征向量。
使用舉一個實際的例子分析:
用opencv對一個三角形進行特征點檢測,得到如下結果:
提取特征向量,得到如下結果:
這幅圖的每一行就是一個128維的特征向量,維度用0-255表示。黑一些就是小,白就是大。
粗略可以看出,這些特征點排布較為相似,因為都是角
再來一個:
樓主解決了麼?我也想問這個問題呢。
哈哈,我有一個基於opencv實現的sift,我把代碼貼出來,你自己看看吧~~~
void sift_detector_and_descriptors(IplImage* i_left,IplImage* i_right)
{
Mat mat_image_left=Mat(i_left,false);
Mat mat_image_right=Mat(i_right,false);
cv::SiftFeatureDetector *pDetector=new cv::SiftFeatureDetector;
pDetector->detect(mat_image_left,left_key_point);
pDetector->detect(mat_image_right,right_key_point);
Mat left_image_descriptors,right_image_descriptors;
cv::SiftDescriptorExtractor *descriptor_extractor=new cv::SiftDescriptorExtractor;
descriptor_extractor->compute(mat_image_left,left_key_point,left_image_descriptors);
descriptor_extractor->compute(mat_image_right,right_key_point,right_image_descriptors);
Mat result_l,result_r;
drawKeypoints(mat_image_left,left_key_point,result_l,Scalar::all(-1),0);
drawKeypoints(mat_image_right,right_key_point,result_r,Scalar::all(-1),0);
//imshow("result_of_left_detector_sift",result_l);
//imshow("result_of_right_detector_sift",result_r);
Mat result_of_sift_match;
BruteForceMatcher<L2<float>> matcher;
matcher.match(left_image_descriptors,right_image_descriptors,result_of_point_match);
drawMatches(mat_image_left,left_key_point,mat_image_right,right_key_point,result_of_sift_match,result_of_sift_match);
imshow("matches_of_sift",result_of_sift_match);
imwrite("matches_of_sift.jpg",result_of_sift_match);
}
void main()
{
IplImage *n_left_image=cvLoadImage("D:\\lena.jpg");
IplImage *n_right_image=......余下全文>>