由於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相關的更新,很...