如何在opencv下使用SIFT

LIU_TAO發表於2021-01-30

SIFT即尺度不變特徵變換,是用於影像處理領域的一種描述。這種描述具有尺度不變性,可在影像中檢測出關鍵點,是一種區域性特徵描述子。
SIFT的尺度不變特徵變換在影像特徵點匹配中十分關鍵,因為我們從不同角度拍攝一個物體,物體的尺寸多少都會發生變化。但是在正常情況下我們連結的opencv庫裡面並沒有包含這個演算法,需要我們主動重新配置一遍。

使用環境:Ubuntu16_Qt_C++_opencv3.2.0_opencvcontrib3.2.0

1.解除安裝之前make配置的opencv
 rm -rf /usr/local
/usr/local為之前make檔案的預設路徑,如果之前有設定為其它路徑,則解除安裝相對應的路徑下的資料夾

2.在官網下載opencv和opencv_contrib並解壓,注意兩者要同一個版本。筆者使用的版本時3.2.0。
筆者在嘗試了許多不同版本後,發現3.4以上的版本似乎因為版權原因,在最後成功make並在.pro檔案連結上後,雖然能inculde <xfeature2d.hpp>,並且在使用SIFT類使能夠自動補全,但是在執行時還是會報錯。
報錯的具體內容如下:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function ‘cv::xfeatures2d::SIFT::create’。
然後根據其提示,筆者也發現即使CMake時勾選上OPNECV_ENABLE_NONFREE,也還是會報同樣的錯。最後才發現原來是版本的問題,在選擇3.4以前的版本似乎就不會出現這個報錯。筆者推測應該是opencv開發人員在更新3.4的版本上在nonfree.hpp加入了一點內容,即如果判斷沒有版權,則輸出這段報錯內容,可能可以通過修改一下這個標頭檔案來實現在3.4以上的版本使用SIFT等演算法。

3.解壓完畢之後,首先是下載一些依賴包,不過在之前配置opencv的時候已經下載過了,所以直接跳過,然後就是通過cmake-gui介面進行make
mkdir build //在opencv3.4的資料夾下新建一個build資料夾
cd build
cmake-gui .. //開啟cmake-gui圖形介面
source的路徑為你的opencv資料夾的路徑,build即你新建的build資料夾的路徑,填寫好後configure,configure介面的選項按預設的來即可

 

 

 


configure之後再新增OPENCV_EXTRA_MOUDULES_PATH的路徑,即為你下載的opencv_contrib資料夾裡面的moudules資料夾

 

 

CMAKE_BUILD_TYPE裡面填RELEASE

 

 

然後點選generate,成功之後回到命令列介面的build路徑下
輸入make命令
筆者在make過程中會遇到類似如下報錯

 

 

翻譯過來就是缺少***.i檔案,解決方案就是手動將該檔案下載,然後放到這個路徑下,然後重新輸入make命令即可。
具體的.i檔案下載需要特殊的方法,可以直接用我已經下載的現成的( ̄▽ ̄)"
連結:https://pan.baidu.com/s/11qltgnkuElInOKGVOr0SAg
提取碼:stw1
複製這段內容後開啟百度網盤手機App,操作更方便哦!


 另一種型別的報錯就是缺少.hpp檔案啦,這種錯誤中缺失的.hpp檔案我們可以在本地的硬碟裡面找到,然後手動複製貼上這個.hpp檔案。但這裡比較特殊,需要在上一級目錄即detail資料夾下,新建opencv2資料夾,然後再在opencv2資料夾裡新建xfeatures2d資料夾,最後在xfeatures2d資料夾下貼上cuda.hpp,然後重新輸入make命令即可(哈哈,是不是很奇怪,但好像就是這樣才行,不要問我是怎麼知道的≡(▔﹏▔)≡)

 

 

解決了上面兩種報錯的型別,基本上就可以make成功了

4.make成功後你可以在/usr/local目錄下看到成功下載的檔案,然後就是在Qt連結你成功下載的檔案啦。具體就是新建專案,在.pro檔案最後新增如下文字
INCLUDEPATH += /usr/local/include \
               /usr/local/include/opencv \
               /usr/local/include/opencv2

LIBS += /usr/local/lib/lib*
5.然後就可以使用SIFT等類啦┗|`O′|┛ 嗷~~

相關文章