VisualStudio2017+OpenCV3.2+robwhess-opensift配置

因爲做業需求須要使用sift算子做圖像拼接,本打算用CImg本身寫一個sift,但因爲參考robwhess的實現不只代碼實際上與robwhess的很類似(照着人家的輪子造輪子真是沒意義),並且還有不少問題要改,處於時間考慮就暫時用robwhess的OpenCV版本的sift算子。因爲第一次使用vs+opencv因此順便記錄一下配置過程,對opencv配置不感興趣的能夠直接跳過。關於sift算法的講解會在CImg版本完善後一塊兒放出,目前告訴你sift用於提取出尺度無關、光照無關、具備旋轉不變性的局部特徵點。linux

Visual Studio 2017+OpenCV-3.2.0配置

因爲重裝過系統因此從新下載的Visual Studio,因此VS更新到了2017版本,對OpenCV的2.x版本都再也不支持,被迫使用了3.2.0的最新版本(最大的壞處在於3.x中nonfree的模塊被移除了)。c++

下載安裝

下載這兩個東西的過程就沒必要再提了,OpenCV記得下載安裝文件而不是壓縮文件,壓縮文件中沒有build文件夾。git

Windows環境變量配置

將${你的OpenCV解壓路徑}\opencv\build\x64\vc14\bin加入到系統變量Path中github

Visual Studio配置

打開你須要使用OpenCV的項目,右擊項目選擇屬性頁打開。
在「VC++目錄」中的「包含目錄」一欄加入${你的OpenCV解壓路徑}\opencv\build\include;${你的OpenCV解壓路徑}\opencv\build\include\opencv;${你的OpenCV解壓路徑}\opencv\build\include\opencv2。
圖片描述算法

在"VC++目錄"的「庫目錄」一欄加入${你的OpenCV解壓路徑}\opencv\build\x64\vc14\lib。圖片描述函數

在「連接器」->「輸入」的「附加依賴項」欄中加入以前庫目錄添加的那個lib文件夾下的兩個lib文件,這裏不須要加路徑直接寫文件名便可(OpenCV3.x省了不少lib,若是使用2.x這裏有貌似38個lib要加)。
圖片描述
到這裏OpenCV的配置就完成了,能夠上網隨便找一個簡單例子跑一下看看,最簡單的好比讀取一張圖片並顯示5000ms。
圖片描述ui

robwhess-opensift配置

這裏提一下,實際上OpenCV也是提供了SIFT和SURF算子的,可是在3.x的版本中這一塊以及一些其餘功能被移了出去,若是要用須要去github額外下載opencv_contrib,下載下來後用cmake把opencv下的sources從新編譯一下再把opencv_contrib中的modules編譯進去,這一塊網上本身找教程吧,由於我一開始想這麼作可是失敗了。
若是是最新的robwhess的github上的sift,裏面有用到linux系統的庫函數,我懶得去研究windwos下怎麼代替,因此找了舊版本的sift,也是在別人那裏看到的,連接http://pan.baidu.com/share/li...
把這裏的文件下載下來直接加到本身的項目裏就好,其中全部的opencv頭文件在原代碼裏都是直接include實際上須要修改爲<opencv\xxx>,而後運行一下看一看有什麼問題看着提示改,這一塊我懷疑每一個人遇到的可能會不同,我就提一下我去改動的地方。spa

關於cstdlib的noexcept的報錯

robwhess是用C實現的sift,由於我打算用c++,因此要把全部.c文件改爲.cpp文件指針

指針問題

c裏void到其餘類型的指針轉換是不用顯示聲明的,但c++不行,因此全部calloc或malloc要在函數前面加上強制指針轉換blog

CV_RGB和CvScalar的類型轉換問題

原本CV_RGB是定義的宏實際調用的cvScalar的構造函數,因此你能夠直接改爲使用cvScalar的構造函數,一樣有兩個宏定義爲CV_RGB的也能夠直接改成cvScalar,不過要注意參數順序是反過來的,CV_RGB的參數是r、g、b三個通道,但cvScalar是b、g、r

cvLine和cvEllipse函數未定義

OpenCV的3.x裏彷佛這兩個畫圖的函數不在cxcore裏了,include一下cv.h就能夠正常使用這兩個函數

cvRound,cvFloor,cvCeil宏沒法找到

直接使用c++本身的round,floor,ceil函數替代便可

sift的使用

robwhess使用feature結構體存儲的特徵點,對於OpenCV的C版本圖像的數據格式是IplImage,初始化圖像以及一個feature的指針,調用sift_features()方法傳入這兩個數據,會返回特徵點個數,使用imgfeatures.h中的draw_features、draw_oxfd_features、draw_lowe_features方法能夠在圖像中標註特徵點,對於3.x版本使用cvarrToMat函數能夠將IplImage數據格式的圖像轉爲Mat格式,後者是C++中OpenCV存儲圖像的常見數據格式。draw_features的效果圖以下圖片描述

相關文章
相關標籤/搜索