sift演算法圖像匹配
A. java opencv 怎樣確定sift 匹配結果
這幾天繼續在看Lowe大神的SIFT神作,看的眼花手腳抽筋。也是醉了!!!!實在看不下去,來點干貨。我們知道opencv下自帶SIFT特徵檢測以及MATCH匹配的庫,這些庫完全可以讓我們進行傻瓜似的操作。但實際用起來的時候還不是那麼簡單。下文將對一個典型的基於OPENCV的SIFT特徵點提取以及匹配的常式進行分析,並由此分析詳細的對OPENCV中SIFT演算法的使用進行一個介紹。
OPENCV下SIFT特徵點提取與匹配的大致流程如下:
讀取圖片-》特徵點檢測(位置,角度,層)-》特徵點描述的提取(16*8維的特徵向量)-》匹配-》顯示
其中,特徵點提取主要有兩個步驟,見上行黃子部分。下面做具體分析。
1、使用opencv內置的庫讀取兩幅圖片
2、生成一個SiftFeatureDetector的對象,這個對象顧名思義就是SIFT特徵的探測器,用它來探測衣服圖片中SIFT點的特徵,存到一個KeyPoint類型的vector中。這里有必要說keypoint的數據結構,涉及內容較多,具體分析查看opencv中keypoint數據結構分析,裡面講的自認為講的還算詳細(表打我……)。簡而言之最重要的一點在於:
keypoint只是保存了opencv的sift庫檢測到的特徵點的一些基本信息,但sift所提取出來的特徵向量其實不是在這個裡面,特徵向量通過SiftDescriptorExtractor 提取,結果放在一個Mat的數據結構中。這個數據結構才真正保存了該特徵點所對應的特徵向量。具體見後文對SiftDescriptorExtractor 所生成的對象的詳解。
就因為這點沒有理解明白耽誤了一上午的時間。哭死!
3、對圖像所有KEYPOINT提取其特徵向量:
得到keypoint只是達到了關鍵點的位置,方向等信息,並無該特徵點的特徵向量,要想提取得到特徵向量就還要進行SiftDescriptorExtractor 的工作,建立了SiftDescriptorExtractor 對象後,通過該對象,對之前SIFT產生的特徵點進行遍歷,找到該特徵點所對應的128維特徵向量。具體方法參見opencv中SiftDescriptorExtractor所做的SIFT特徵向量提取工作簡單分析。通過這一步後,所有keypoint關鍵點的特徵向量被保存到了一個MAT的數據結構中,作為特徵。
4、對兩幅圖的特徵向量進行匹配,得到匹配值。
兩幅圖片的特徵向量被提取出來後,我們就可以使用BruteForceMatcher對象對兩幅圖片的descriptor進行匹配,得到匹配的結果到matches中,這其中具體的匹配方法暫沒細看,過段時間補上。
至此,SIFT從特徵點的探測到最後的匹配都已經完成,雖然匹配部分不甚了解,只掃對於如何使用OPENCV進行sift特徵的提取有了一定的理解。接下來可以開始進行下一步的工作了。
附:使用OPENCV下SIFT庫做圖像匹配的常式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// opencv_empty_proj.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include opencv.hpp>
#include features2d/features2d.hpp>
#includenonfree/nonfree.hpp>
#includelegacy/legacy.hpp>
#include
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//從文件中讀入圖像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");
//如果讀入圖像失敗
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
if(img2.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//顯示圖像
imshow("image before", img);
imshow("image2 before",img2);
//sift特徵檢測
SiftFeatureDetector siftdtc;
vectorkp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<angle<<"\t"<class_id<<"\t"<octave<<"\t"<pt<<"\t"<response<<endl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2> matcher;
vector matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函數等待按鍵,按鍵盤任意鍵就返回
waitKey();
return 0;
}
B. 如何比較SIFT,SURF,Harris-SIFT圖像匹配演算法性能
SIFT匹配(Scale-invariant feature transform,尺度不變特徵轉換)是一種電腦視覺的演算法用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變數,此演算法由 David Lowe 在1999年所發表,2004年完善總結。其應用范圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。
局部影像特徵的描述與偵測可以幫助辨識物體,SIFT 特徵是基於物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。對於光線、雜訊、些微視角改變的容忍度也相當高。基於這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特徵資料庫中,很容易辨識物體而且鮮有誤認。使用 SIFT特徵描述對於部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特徵就足以計算出位置與方位。在現今的電腦硬體速度下和小型的特徵資料庫條件下,辨識速度可接近即時運算。SIFT特徵的信息量大,適合在海量資料庫中快速准確匹配。
2、SIFT特徵的主要特點
從理論上說,SIFT是一種相似不變數,即對圖像尺度變化和旋轉是不變數。然而,由於構造SIFT特徵時,在很多細節上進行了特殊處理,使得SIFT對圖像的復雜變形和光照變化具有了較強的適應性,同時運算速度比較快,定位精度比較高。如:
在多尺度空間採用DOG運算元檢測關鍵點,相比傳統的基於LOG運算元的檢測方法,運算速度大大加快;
關鍵點的精確定位不僅提高了精度,而且大大提高了關鍵點的穩定性;
在構造描述子時,以子區域的統計特性,而不是以單個像素作為研究對象,提高了對圖像局部變形的適應能力;
C. 在open cv中應用SIFT運算元進行圖像匹配,匹配成功了,可是應該怎麼獲取這些特徵點的坐標呢
舉個例子
SiftFeatureDetectordetector;//構造函數採用內部默認的
std::vector<KeyPoint>keypoints_1,keypoints_2;//構造2個專門由點組成的點向量用來存儲特徵點
detector.detect(img_1,keypoints_1);//將img_1圖像中檢測到的特徵點存儲起來放在keypoints_1中
detector.detect(img_2,keypoints_2);//同理
keypoints_1和keypoints_2里邊存的就是兩幅圖像的特徵點坐標
D. 圖像匹配方法有哪些
圖像匹配的方法很多,一般分為兩大類,一類是基於灰度匹配的方法,另一類是基於特徵匹配的方法。
(1)基於灰度匹配的方法。也稱作相關匹配演算法,用空間二維滑動模板進行圖像匹配,不同演算法的區別主要體現在模板及相關准則的選擇方面。
(2)基於特徵匹配的方法。首先在原始圖像中提取特徵,然後再建立兩幅圖像之間特徵的匹配對應關系。常用的特徵匹配基元包括點、線、區域等顯著特徵。圖像特徵相比像素點數量殺過少很多,特徵間的匹配度量隨位置變化尖銳,容易找出准確的匹配位置,特徵提取能大大減少雜訊影響,對灰度變化、形變和遮擋有較強的適應力。
圖像匹配的任務就是尋找同一場景的兩幅或多幅圖像中像素點之間的對應關系。我們研究的圖像匹配方法主要是基於圖像特徵的方法,主要包括特徵提取、特徵描述和特徵匹配三步。SIFT方法是目前效果較好的經典匹配方法,在我們的研究過程中,均是採用SIFT方法作為基準來評價我們提出的演算法的。
E. 在MATLAB的sift演算法中,怎麼用一個模板與多幅圖像進行匹配
(1) 尺度不變特徵變換(SIFT演算法)概要
是一種計算機視覺的演算法,用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變數。
此演算法由 David Lowe 在1999年所發表,2004年完善總結。其應用范圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。此演算法有其專利,專利擁有者為 英屬哥倫比亞大學。
局部影像特徵的描述與偵測可以幫助辨識物體,SIFT 特徵是基於物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。 對於光線、雜訊、些微視角改變的容忍度也相當高。基於這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特徵資料庫中,很容易辨識物體而且鮮有誤認。使用 SIFT特徵描述對於部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特徵就足以計算出位置與方位。在現今的電腦硬體速度下和小型的特徵資料庫條件下,辨識速度可接近即時運算。SIFT特徵的信息量大,適合在海量資料庫中快速准確匹配。
(2 ) Matlab代碼主要功能函數如下: match.m:測試程序
功能:該函數讀入兩幅(灰度)圖像,找出各自的 SIFT 特徵, 並顯示兩連接兩幅圖像中被匹配的特徵點(關鍵特徵點(the matched keypoints)直線(將對應特徵點進行連接)。判斷匹配的准則是匹配距離小於distRatio倍於下一個最近匹配的距離( A match is accepted only if its distance is less than distRatio times the distance to the second closest match. 該程序返回顯示的匹配對的數量。( It returns the number of matches displayed.) 調用實例: match('desk.jpg','book.jpg');
( 假如,想測試一個含有一本書的桌面的圖像 和一本書的圖像之間特徵匹配) 調用方法和參數描述:略。 注意:(1)圖像為灰度圖像,如果是彩色圖像,應該在調用前利用rgb2gray轉換為灰度圖像。
(2)參數distRatio 為控制匹配點數量的系數,這里取 0.6,該參數決定了匹配點的數量,在Match.m文件中調整該參數,獲得最合適的匹配點數量。 sift.m :尺度不變特徵變換(SIFT演算法)的核心演算法程序
功能:該函數讀入灰度圖像,返回SIFT 特徵關鍵點( SIFT keypoints.) 調用方法和參數描述:
調用方式:[image, descriptors, locs] = sift(imageFile) 輸入參數( Input parameters):
imageFile: 圖像文件名.
輸出或返回參數( Returned):
image: 是具有double format格式的圖像矩陣
descriptors: 一個 K-by-128 的矩陣x, 其中每行是針對找到的K個關鍵特徵點(the K keypoints)的不變數描述子. 這個描述子(descriptor)是一個擁有128個數值並歸一化為單位長度向量.
locs: 是K-by-4 矩陣, 其中的每一行具有四個數值,表示關鍵點位置信息 (在圖像中的行坐標,列坐標(row, column) ,注意,一般圖像的左上角為坐標原點), 尺度scale,高斯尺度空間的參數,其中該參數也決定了frame(結構)確定的圖像disk的大小, 最後一個參數是方向orientation). 方向參數的范圍是[-PI, PI] 單位為弧度.
appendimages.m: 該函數創建一個新的圖像分別包含兩個匹配的圖像和他們之間
的匹配對的連接直線. (3) 實際案例執行結果:
程序代碼使用matlab和c混合編程。用matlab打開文件中的sift_match.m文件,並執行。如下圖所示:
F. 在我寫的關於sift演算法的前倆篇文章里頭,已經對sift演算法有了初步的介紹:九、圖像特徵提取與匹配之SIFT演算法
一種基於SIFT的仿射不變特徵提取新方法.pdf
改進SIFT特徵描述符在影像匹配中的應用研究.pdf
基於二階矩的SIFT特徵匹配演算法.pdf
基於改進的SIFT特徵的圖像雙向匹配演算法.pdf
一種改進的SIFT特徵點匹配演算法.pdf
一種改進的SIFT特徵匹配演算法及其實現.pdf
G. sift演算法是什麼
Sift演算法是David Lowe於1999年提出的局部特徵描述子,並於2004年進行了更深入的發展和完善。Sift特徵匹配演算法可以處理兩幅圖像之間發生平移、旋轉、仿射變換情況下的匹配問題,具有很強的匹配能力。
這一演算法的靈感也十分的直觀,人眼觀測兩張圖片是否匹配時會注意到其中的典型區域(特徵點部分),如果我們能夠實現這一特徵點區域提取過程,再對所提取到的區域進行描述就可以實現特徵匹配了。
sift演算法的應用
SIFT演算法目前在軍事、工業和民用方面都得到了不同程度的應用,其應用已經滲透了很多領域,典型的應用如下:物體識別;機器人定位與導航;圖像拼接;三維建模;手勢識別;視頻跟蹤;筆記鑒定;指紋與人臉識別;犯罪現場特徵提取。
H. 圖像配准技術是怎麼實現圖像的特徵匹配的
SIFT圖像處理代碼,必須和三個文件一起下載使用:基於SIFT特徵的圖像配准(Matlab源代碼)、基於SIFT特徵的圖像配准(模擬圖片)
使用SIFT特徵描述對於部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特徵就足以計算出位置與方位。在現今的電腦硬體速度下和小型的特徵資料庫條件下,辨識速度可接近即時運算。SIFT特徵的信息量大,適合在海量資料庫中快速准確匹配。
I. 如何用sift從圖中匹配到多個目標
特徵點(角點)匹配 圖像匹配能夠應用的場合非常多,如目標跟蹤,檢測,識別,圖像拼接等,而角點匹配最核心的技術就要屬角點匹配了,所謂角點匹配是指尋找兩幅圖像之間的特徵像素點的對應關系,從而確定兩幅圖像的位置關系。
J. sift算是是屬於圖像匹配還是圖像配准
圖像匹配是在大圖像中尋找與小圖像(模板)
相似的區域。
圖像配準是將兩幅尺寸相當的圖像映射到
同一個坐標系中,使它們的特徵對應。其中
一幅圖像的坐標不變,稱為固定圖像,另一
幅圖像要平移、旋轉、縮放,稱為浮動圖像,對號入座吧