Opencv2 4 9原始碼分析 SIFT

2021-06-27 20:08:43 字數 1689 閱讀 4785

由於sift演算法在計算機視覺的特徵檢測和特徵描述中表現十分優異,因此該演算法一經提出,就引起了廣泛的關注。國內外對其研究的人很多,相關的資料也很多。在csdn中,有幾位作者的文章對sift演算法介紹得很詳細,如網名為:zddhub、rachel zhang和xiaowei_cqu。由王永明和王貴錦所編著的,由國防工業出版社出版的《影象區域性不變性特徵與描述》也對該演算法進行了詳細的介紹。上述文章對我幫助很大。

經過一段時間的研究,並結合opencv中的源**,自認為對sift演算法有了一定的認識和體會,因此也寫了一篇關於sift的文章。該文章共分為三部分,首先是sift的演算法分析,然後是opencv的原始碼分析,最後是應用例項。在演算法分析中,注意了每個細節的描述;在原始碼分析中,基本做到了每條**都進行了注釋;在應用例項中,列舉了特徵提取和影象匹配兩個例項。

為了不使這篇博文過於空洞,我把這篇文章的第三部分貼上在這裡。

首先給出的是特徵點的檢測:

#include "opencv2/core/core.hpp"

#include "highgui.h"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/nonfree/nonfree.hpp"

using namespace cv;

//using namespace std;

int main(int argc, char** argv)

結果如下圖所示:

上面的程式需要說明一點的是,如果需要改變sift演算法的預設引數,可以通過例項化sift類的時候更改,例如我們只想檢測20個特徵點,則例項化sift的語句為:

sift sift(20);

下面給出利用描述符進行影象匹配的例項:

#include "opencv2/core/core.hpp"

#include "highgui.h"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/nonfree/nonfree.hpp"

#include "opencv2/legacy/legacy.hpp"

using namespace cv;

using namespace std;

int main(int argc, char** argv)

結果如下圖所示:

程式是通過距離測度實現兩幅影象描述符之間的比較的,距離越小,匹配性越好,越說明這兩個描述符表示的是同一事物。描述符的匹配結果儲存在匹配器運算元matches中。如果直接使用matches,匹配效果並不好,因為它是盡可能的匹配所有的描述符。因此我們要進行篩選,只保留那些好的結果。在這裡,我們利用排序,選擇距離最小的前30個匹配結果,並進行輸出。另外,matcher.match函式中,兩個描述符的順序一定不能寫反,否則執行會出錯。

學習Opencv 2 4 9(二) 操作畫素

來自 本質上說一張影象就是由數值組成的矩陣。opencv 2.x由 cv mat 這個資料結構來表示一張影象。矩陣的每乙個元素代表了乙個畫素。對於彩色影象而言矩陣的元素是乙個三元數。對影象有了這個新的認識,下面可以試著借助opencv處理影象了。先來看一下今天要處理的影象 今天的主題是訪問畫素,首先...

OpenCV2 4 9與VS2010配置遇到的問題

軟體 opencv 2.4.9 vs2010 從以下圖中我們可以看到opencv和 vs需要版本匹配,當安裝後的opencv檢視當前版本opencv2.4.9可以和vs2010 vs2011以及 vs2012匹配。1 在配置專案工程時,附加依賴項怎麼刪除和重新新增 移除 要想刪除依賴附加項主要是能夠...

Opencv2 4 9各標頭檔案功能說明

opencv open source computer vision library 乙個遵循bsd協議的計算機視覺技術開源庫,包含了幾百個計算機視覺演算法。目前最新版本應該是opencv3.0,alpha版和beta版都有了,我目前是用的2.4.9,3.0版本貌似有不少3d還有gpu相關的更新,很...