程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> opencv中SiftDescriptorExtractor所做的SIFT特征向量提取工作簡單分析,opencvsift

opencv中SiftDescriptorExtractor所做的SIFT特征向量提取工作簡單分析,opencvsift

編輯:C++入門知識

opencv中SiftDescriptorExtractor所做的SIFT特征向量提取工作簡單分析,opencvsift


SiftDescriptorExtractor對應於SIFT算法中特征向量提取的工作,通過他對關鍵點周圍鄰域內的像素分塊進行梯度運算,得到128維的特征向量。具體有如下幾個操作:

0、首先,我們假設在之前關鍵點提取的步驟中,我們對一個三角形提取關鍵點,檢測到其中一個關鍵點的坐標為三角形的一個角(如下面用紅圈圈出的),如下圖

image_thumb12

放大看,假設檢測到該關鍵點的方向如下圖:

image_thumb4

1、將關鍵點周圍的像素旋轉到一個統一的方向,以保證方向不變性。如下圖

image_thumb11

2、將這些像素分成4X4的小塊

image_thumb9

對每個格子進行分析,將格子中的像素計算梯度,映射到8個方向上,對於每一個格子,可以得到一個8維的向量,對於一個關鍵點周圍16個格子,則得到了16X8=128維的向量,這就是一個關鍵點特征向量。

image_thumb10

使用舉一個實際的例子分析:

用opencv對一個三角形進行特征點檢測,得到如下結果:

image_thumb18

提取特征向量,得到如下結果:

image_thumb19

這幅圖的每一行就是一個128維的特征向量,維度用0-255表示。黑一些就是小,白就是大。

粗略可以看出,這些特征點排布較為相似,因為都是角

再來一個:

image_thumb20

image_thumb23


sift算法中的那個特征點的128(或者64)descriptor維特征向量,編程時是怎表示的呀?

樓主解決了麼?我也想問這個問題呢。
 

基於sift特征提取的圖像匹配代碼,最好是利用C++與opencv編寫

哈哈,我有一個基於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=......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved