opencv3.0中contrib模塊的添加+實現SIFT/SURF算法


平台:win10 x64 +VS 2015專業版 +opencv-3.x.+CMake+Anaconda3(python3.7.0)

 

Issue說明:Opencv3.0版本已經發布了有一段時間,在這段時間也是不斷的進行了更新和修復,最近看了一下3.0新增的一些功能,感覺還是蠻強大的,作為一個一直以Opencv為開發環境的程序員來說是一定要體驗一下這個新版本的,特別看到說在tracking領域近年比較好的文章TLD和 KCF都有擴展包了,那更是要嘗試一下。嘗試用擴展包實現sift/surf算法。

原因:opencv從2.x到3.x是一個很大的轉變,對於很多功能不完善、性能不穩定的模塊,都被方法了extra_modules(擴展模塊)里面了。這樣倒是穩定了,但是對於我這樣的新手,要添加這些擴展模塊卻是相當的痛苦啊!!因為要用到sift/surf算法,但是3.0以后這些算法都放到了在xfeacture模塊中,並不在主模塊中,於是就開始了艱難的配置過程。

解決辦法:Win10 x64+vs2015+opencv3.4.1+附加模塊opencv_contrib+cmake3.15.2編譯和配置

目錄:

一、下載地址匯總(OpenCV+OpenCV_contrib+CMake)
二、中間遇到的Issue匯總
三、主要參考鏈接
四、項目Issue

 

一、下載地址匯總(OpenCV+OpenCV_contrib+CMake)

OpenCV:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/

OpenCV_contrib:https://github.com/opencv/opencv_contrib/releases

CMake:https://cmake.org/download/


二、中間遇到的Issue匯總

Issue1:在github上下載資料,速度只有10幾KB/s,下個opencv_contrib-3.4.1.zip,需要一個多小時!!!如何修改host文件加快github訪問及下載速度?

答:進入目錄C:\Windows\System32\drivers\etc並打開host文件

就是要將新的host添加到文件后面添加內容

訪問:http://github.global.ssl.fastly.net.ipaddress.com/#ipinfo

查看IP地址(本人的是:151.101.185.194

然后訪問:http://github.com.ipaddress.com/#ipinfo

查看IP地址(本人的是:192.30.253.112

然后將就可以,在host文件末尾添加新的數據(一定要另起一行哦!)

151.101.185.194 github.global.ssl.fastly.net
192.30.253.112 github.com

為了是host生效,

在cmd里輸入如下指令

ipconfig /flushdns

參考:百度經驗:github怎么修改host表下載——https://jingyan.baidu.com/article/ea24bc397265049a62b331d7.html

 

Issue2:我之前的電腦是Win10 x64+vs2015+opencv3.4.1(使用opencv-3.4.1-vc14_vc15.exe解壓完成的,無附加模塊opencv_contrib)+cmake3.13.4,參看網上 opencv3.0中contrib模塊的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929  配置一直報錯?方案九(x64)、方案十(x86)成功!

答:網上opencv3.0中contrib模塊的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929中 從以下網址下載opencv源代碼和擴展模塊源代碼(一定要從下面鏈接下載,實際此博客這塊有錯誤!參看總結)。
OpenCV: https://github.com/Itseez/opencv
Extra Modules: https://github.com/Itseez/opencv_contrib

下載:opencv-master.zip+opencv_contrib-master.zip

然后點擊“configure”按鈕,更改內容,然后點擊“configure”,回提示Generate Done。

在D:\opencv3\build下找到OPENCV.sln,打開,找到CMakeTargets下的INSTALL,在Debug(或Release)下分別右鍵生成,經過40分鍾左右報錯!!!

方案一:上邊網址:opencv3-master.zip+opencv_contrib-master.zip+vs 14 2015 x64(第一次點擊“configure”按鈕選擇)
   INSTALL生成時 報錯100多項 警告100多項

方案二:上邊網址:opencv3-master.zip+opencv_contrib-master.zip+vs 14 2015 win32(第一次點擊“configure”按鈕選擇)
    INSTALL生成時 報錯100多項 警告100多項

官網下載opencv:opencv-master.zip+opencv_contrib-master.zip  鏈接:https://github.com/opencv

方案三:官網:opencv4-master.zip+opencv_contrib-master.zip+vs 14 2015 x64(第一次點擊“configure”按鈕選擇)
    INSTALL生成時 報錯100多項 警告100多項

方案四:官網:opencv4-master.zip+opencv_contrib-master.zip+vs 14 2015 win32(第一次點擊“configure”按鈕選擇)
    INSTALL生成時 報錯100多項 警告100多項

 

方案五:懷疑CMake版本問題,下載最新的CMake3.15.2(官網——CMake:https://cmake.org/download/)重試了方案一二三四

 INSTALL生成時 報錯100多項 警告100多項

方案六:懷疑Win10系統環境變量問題,去掉%JAVA_HOME%\bin;%MYSQL_HOME%\bin\;D:\Working\buildOpenCV\bin;D:\ProgramFiles\gtk_-bundle_2.24.10_win32\bin;D:\ProgramFiles\MinGW-V5.1.6\MinGW\bin重試了方案一二三四
 INSTALL生成時 報錯100多項 警告100多項

 

方案七:Win10+VS2017編譯opencv3.2.0和opencv_contrib3.2.0來調用text模塊——https://www.jianshu.com/p/4d49aa5e5656  中注意在安裝VS2017的時候需要勾選使用C++的桌面開發這個選項,否則后面用CMake編譯的時候可能會提示找不到C++編譯器。(估計應該就是需要右邊小紅框里的那個東西,但是保險起見我還是全裝了=-=) 懷疑VS2015安裝問題,
 在網上搜索VS2015未報此安裝問題,另外自己安裝博客也沒有問題。

 

方案八:Win10+vs2015+opencv3.4.1+附加模塊opencv_contrib+cmake3.11.0編譯和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1,重新下載opencv3.4.1+附加模塊opencv_contrib

注意:opencv_contrib的版本一定要和opencv相同!!!下載:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip
官網:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 win32(第一次點擊“configure”按鈕選擇)
    INSTALL生成時 報錯,但是這一次只報了兩個錯誤:1.const char不能賦值為char
;2.模塊計算機類型“x64”與目標計算機類型“X86”沖突

第一個錯誤通過定位(cv2.cpp的889行)修改“char* str = PyString_AsString(obj);”為“const char* str = PyString_AsString(obj);”解決

第二個錯誤無法修改

方案九:官網:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 x64(第一次點擊“configure”按鈕選擇)
    INSTALL生成時 報錯,但是這一次只報了兩個錯誤:1.const char不能賦值為char;2.無法打開文件"python37_d.lib"   

 

第一個錯誤通過定位(cv2.cpp的889行)修改“char* str = PyString_AsString(obj);”為“const char* str = PyString_AsString(obj);”解決

 

第二個錯誤解決方案  參考:無法打開文件“python35_d.lib”——https://blog.csdn.net/weixin_38383877/article/details/89891380

 

法一:(簡單)全盤搜索python37.lib,把python37.lib復制粘貼后命名為python37_d.lib。(實際主要搜索是Anaconda3目錄下,我的python37.lib兩處在(1)C:\Users\wang\Anaconda3\libs,復制粘貼后命名為python37_d.lib;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\libs,復制粘貼后命名為python37_d.lib試了,生成不報錯,重新生成還是報錯!

法二:在 Anaconda3 的 pyconfig.h 文件中做出修改兩處。(搜索:pyconfig.h ,實際主要搜索是Anaconda3目錄下,我的pyconfig.h兩處在(1)C:\Users\wang\Anaconda3\include,記事本打開pyconfig.h,1)查找python37_d.lib,改為python37.lib;2)查找Py_DEBUG,注銷://#       define Py_DEBUG;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\include,記事本打開pyconfig.h,1)查找python37_d.lib,改為python37.lib;2)查找Py_DEBUG,注銷://#       define Py_DEBUG;)  試了,成功!!!

注意:我試了只修改法一,法二(1)處仍會報錯無法打開文件"python37_d.lib" 。

 

方案十:更改python參考:1)LNK1104 無法打開文件“python37_d.lib” 解決辦法——https://blog.csdn.net/weixin_43788499/article/details/84933210

2)Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解決方案編譯報錯“找不到python36_d.lib”錯誤——https://www.cnblogs.com/qilin20/p/10987398.html

具體實現:第一步:去掉Anaconda的路徑。(我刪除了系統環境變量:C:\Users\wang\Anaconda3;C:\Users\wang\Anaconda3\Scripts;C:\Users\wang\Anaconda3\Library\bin;C:\Users\wang\Anaconda3\Library\mingw-w64\bin)

     第二步:重新安裝Python,確保你安裝了python的debug版本,勾選最后一項Download debug binaries(requires VS 2015 or later),然后install。(Python官網:https://www.python.org/,下載了python-3.6.5-amd64.exe,安裝參看:https://baijiahao.baidu.com/s?id=1606573927720991570&wfr=spider&for=pc,在高級選項中勾選最后一項Download debug binaries(requires VS 2015 or later)

     第三步:檢查Python的系統環境變量,若第二步沒有添加,添加為新安裝python的。(手動添加了系統環境變量:D:\ProgramFiles\Python36

     第四步:方案八(官網:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 win32)配置,INSTALL生成時沒有報錯(錯誤0,警告66),成功

     第五步:測試代碼Issue11報錯:由於找不到 opencv_world341d.dll,無法繼續執行代碼

         解決方案:D:\ProgramFiles\OpenCV3.4.1\opencv\mybuild\install\x86\vc14\bin3個后綴是.dll(opencv_world341d.dll,opencv_ffmpeg341.dll,opencv_img_hash341d.dll)應用程序擴展復制到C:\Windows\SysWOW64中,重新運行,成功!(參看:由於找不到 opencv_world320.dll,無法繼續執行代——https://www.cnblogs.com/ganjiqi/p/8651350.html
         注意:64位系統用戶需要注意,32位的DLL文件放在【C:\Windows\SysWOW64】,64位的DLL文件放在“【C:\Windows\System32】。

 

  由於不用了Anaconda的python,更換了python,x86也成功了,所以,需要測試之前的方案。

   目前測試方案一方案三仍然fail,即INSTALL生成時 報錯100多項 警告100多項

 

 

綜上,方案九(x64)、方案十(x86)成功!

方案九(x64):Anaconda3(python3.7.0),配置x64可以,x86報錯模塊計算機類型“x64”與目標計算機類型“X86”沖突

方案十(x86):python3.6.5,配置x86和x64都可以。推薦!!!

方案十配置過程:

步驟一:下載python3.6.5+opencv3.4.1+opencv_contrib+cmake

    一、下載地址匯總(OpenCV+OpenCV_contrib+CMake)+方案十具體實現

步驟二:Cmake編譯

    Issue3+Issue4+Issue6

步驟三:生成庫文件

    見Issue7

步驟四:配置系統環境變量和工程

    見Issue9

步驟五:測試項目

    見Issue11+Issue12

 

總結:(1)Win10+vs2015+opencv3.4.1+附加模塊opencv_contrib+cmake3.11.0編譯和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1

 VS2015編譯只能用下載編譯好的cv3.x,而不能用下載好的opencv-master.zip。要使用下載編譯好的cv3.x!!!有的博客這塊有錯誤!

   (2)在Windows下編譯擴展OpenCV 3.1.0 + opencv_contrib——https://www.cnblogs.com/jliangqiu2016/p/5597501.html

里面說明了:1)由於現在官方的opencv3.1.0要在x64上使用,而且在visual studio2013包括本身以后的平台上使用,怎么讓其在以前的版本使用,也可以在x86機子上跑呢?這也就是要CMake的原因之一

      2)CMake編譯工具的選擇:第一次導出時需要設置后面用來編譯此OpenCV.sln工程的VS的版本(這里特別要注意的是,自己機器上是否裝有相應的VS版本,如果沒有裝,還是要編譯就會出錯,可能是找不到對應的工具原因,以及選擇X86和X64),這里用的是VS 2015,也可以選擇Visual Studio 10,就能在VS2010上使用:

      3)debug版本和release版本的區別:release版本需要用動態鏈接庫?參看OpenCV:Debug和Release模式 && 靜態和動態編譯——https://www.cnblogs.com/king-lps/p/7758050.html

 

Issue3:1)CMake如何操作?2)Cmake編譯第一次編譯完成后會顯示編譯opencv所需要的參數。在Name為OPENCV_EXTRA_MODULES_PATH的Value中填入opencv_contrib-3.0.0的路徑/modules(我的為:D:\ProgramFiles\OpenCV3\opencv\opencv_contrib-3.4.1\modules),添加后報錯?3)Cmake編譯第一次編譯后需要更改哪些參數?4)第二次編譯注意事項?

1)CMake使用?

答:安裝cmake后,打開bin目錄下的cmake-gui.exe
where is the source code輸入opencv地址/sources地址
where to build the libraries輸入保存編譯結果的地址
點擊Configure選擇對應自己電腦上的VS版本的編譯器,對於VS2015來說,32位的選擇Visual Studio 14 2015,64位的選擇Visual Studio 14 2015 Win64,點擊finish后自動進行第一次編譯

2)路徑問題!

答:windows系統的路徑問題,是“\”,而CMake路徑應為“/”,所以更改為D:/ProgramFiles/OpenCV3/opencv/opencv_contrib-3.4.1/modules

3)Cmake編譯第一次編譯后需要更改哪些參數?

答:四個參數:

1)選擇 BUILD_opencv_world;
2)OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目錄;一定要是“/”
3)選擇OPENCV_ENABLE_NONFREE
4)去掉BUILD_opencv_hdf——第一次編譯后找不到,第二次編譯后才能找到!

參考:OpenCV4.0群的VS+opencv配置文檔:Windows環境下最新OpenCV代碼的-下載-編譯-使用(2018-9重制).pptx

4)第二次編譯注意事項

答:在第一次編譯后更改完四個參數后,第二次編譯完后一定要檢查一下參數列表,如果參數列表還有紅色標記的條目輸出欄是否有報錯(紅色,主要是下載失敗,參見Issue6,就再嘗試幾次configure,直到所有條目都是白色為止。

 

Issue4:Cmake編譯好的個人建議?后面再忙活都是白干!沒有xfeatures2d這類的文件?

答:【該步驟是個人建議】檢查一下附加模版是否成功編譯並加入到opencv中。如果附加模塊opencv_contrib並未成功編譯到opencv中,那后面再忙活都是白干。因為后面的步驟都比較費時,而且最終到了使用SIFT的時候才會發現附加模塊增加失敗,而且難以鎖定原因,必須返回來逐步檢查。所以個人建議不要跳過這一步,很簡單
方法:進入where to build the binaries中設置的目錄,然后進入modules,查看一下是否有xfeatures2d這類的文件。這類文件是屬於附加模版opencv_contrib的,如果沒有,請檢查一下CMake中參數列表里,OPENCV_EXTRA_MODULES_PATH的Value是否為opencv_contrib-3.0.0的路徑/modules,如果不是,請重新設置OPENCV_EXTRA_MODULES_PATH的Value為opencv_contrib-3.0.0的路徑/modules,然后重新configure、generate。如果附加模塊opencv_contrib並未成功編譯到opencv中,那后面就夠忙活的了,后面更費時,而且最終會配置失敗,還難以想到。

(我檢查了我的路徑D:\ProgramFiles\OpenCV3\opencv\mybuild\modules下沒有xfeatures2d這類的文件,一直重新configure、generate還是沒有,最后在D:\ProgramFiles\OpenCV3\opencv\mybuild\modules\.firstpass下找到了,不知道是不是更改了,反正和網上說的不太一樣,在modules下的.firstpass文件夾下。)

參考:【圖像處理】windows 10 + vs2015+ opencv3.0.0 +附加模塊opencv_contrib編譯和配置——https://blog.csdn.net/chentravelling/article/details/59540828

 

Issue5:Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解決方案編譯報錯“找不到python36_d.lib”錯誤——https://www.cnblogs.com/qilin20/p/10987398.html

答:方案十給出,CMake配置時一定要注意Python的安裝路徑。在此說明VS配置若一直失敗,一定要更改Python。

 

Issue6:關於CMke配置的問題:opencv_ffmpeg.dll;opencv_ffmpeg_64.dll;face_landmark_model.dat一直下載失敗?

答:打開mybuild下CMakeDownloadLog.txt,里邊有下載鏈接,把鏈接傳至手機下載后,再把文件傳到CMakeDownloadLog.txt中說明的文件夾下。

(我的CMakeDownloadLog.txt路徑是D:\ProgramFiles\OpenCV3\opencv\mybuild,下載完成后opencv_ffmpeg.dll;opencv_ffmpeg_64.dll放置D:\ProgramFiles\OpenCV3\opencv\mybuild\3rdparty\ffmpeg下,face_landmark_model.dat放置D:\ProgramFiles\OpenCV3\opencv\mybuild\testdata\cv\face下,注意這里可能沒有testdata,cv,face文件夾,按照CMakeDownloadLog.txt給出的路徑依次建立即可。

 

Issue7:VS2015在解決方案資源管理器中找到CMake Targets,右鍵點擊“生成”的問題?

答:步驟一: 在解決方案資源管理器中找到CMake Targets,右鍵點擊“生成”(大概40分鍾,我的電腦比較渣,50分鍾呢)。
  步驟二:生成成功后,如果在mybuild文件夾中還沒有出現一個名為install的文件夾,回到VS界面,右擊INSTALL->僅用於項目->僅生成INSTALL,再次生成成功后就會出現install文件夾

   (我的路徑是D:\ProgramFiles\OpenCV3\opencv\mybuild,經檢查,mybuild下有了install文件夾。)

但是我使用的是:

  步驟一:在“解決方案'OpenCV'(100多個項目)”上面點擊右鍵-->重新生成解決方案。(也得接近45分鍾呢。)
  步驟二:找到CMakeTargets中的INSTALL,然后右鍵選擇“僅限於項目”-->“僅生成INSTALL”,然后就在D:\ProgramFiles\OpenCV3\opencv\mybuild\install中多了許多東東。

參看:Windows環境下編譯OpenCV3.0和OpenCV_contrib【原創】——https://segmentfault.com/a/1190000003496009

 

Issue8:無法打開文件 無法打開文件‘python37_d.lib’?

答:生成INSTALL時,我碰到過的問題,問題是:無法打開文件‘python37_d.lib’

原因是我之前在電腦上安裝了Anaconda3,openCV用Cmake編譯時都檢測到了。解決方法是打開python3對應的pyconfig.h文件,做兩處修改。

(搜索:pyconfig.h ,實際主要搜索是Anaconda3目錄下,我的pyconfig.h兩處在(1)C:\Users\wang\Anaconda3\include,記事本打開pyconfig.h,1)查找python37_d.lib,改為python37.lib;2)查找Py_DEBUG,注銷://#       define Py_DEBUG;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\include,記事本打開pyconfig.h,1)查找python37_d.lib,改為python37.lib;2)查找Py_DEBUG,注銷://#       define Py_DEBUG;)

 在方案九中的法二已有說明!

 

Issue9:添加系統環境變量?

答:在計算機-環境變量-path中增加CMake:where to build the binaries中設置的路徑\install\x64\vc14\bin

(我的是D:\ProgramFiles\OpenCV3\opencv\mybuild\install\x64\vc14\bin)

 

Issue10:配置新的工程?

答:打開VS2015,新建一個工程
找到屬性管理器->Debug|x64->右擊Microsoft.Cpp.x64.user->屬性
1)VC++目錄-包含目錄
<where to build the binaries中設置的路徑>\install\include
<where to build the binaries中設置的路徑>\install\include\opencv
<where to build the binaries中設置的路徑>\install\include\<opencv2>
2)VC++目錄-庫目錄
<where to build the binaries中設置的路徑>\install\x64\vc14\lib
3)鏈接器-輸入-附加依賴項
這里添加的.lib文件都需要出現在<where to build the binaries中設置的路徑>\install\x64\vc14\lib 中。如果lib文件被添加到附加依賴項里,但是上述文件夾中沒有該lib文件,會出現找不到XXX.lib的錯誤。

(我的where to build the binaries中設置的路徑是D:\ProgramFiles\OpenCV3\opencv\mybuild)

 

Issue11:測試?

答:在工程項目中新建一個cpp,記得添加到工程里。輸入如下代碼:

#include <iostream>  
#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
using namespace cv;

int main()
{
    Mat img = imread("D:/Working/opencvimg/lena.jpg");//讀入一張圖片,更改為自己電腦需要調用的圖片的路徑和圖片名稱。
    namedWindow("Test");     //創建一個名為Test窗口
    imshow("Test", img);   //窗口中顯示圖像
    waitKey(5000);            //等待5000ms后窗口自動關閉
}

選擇Debug,x64,運行代碼。

 

三、主要參考鏈接:

1)Win10+vs2015+opencv3.4.1+附加模塊opencv_contrib+cmake3.11.0編譯和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1

2)【圖像處理】windows 10 + vs2015+ opencv3.0.0 +附加模塊opencv_contrib編譯和配置——https://blog.csdn.net/chentravelling/article/details/59540828

3)opencv3.0中contrib模塊的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929

4)Opencv3.0和contribute模塊的下載 編譯 安裝——https://blog.csdn.net/u012462822/article/details/49100025#comments

5)在Windows下編譯擴展OpenCV 3.1.0 + opencv_contrib——https://www.cnblogs.com/jliangqiu2016/p/5597501.html

 

以上Issue是關於VS2015配置opencv3.0中contrib模塊的,以下Issue針對項目。

四、項目Issue:

Issue12:測試SIFT代碼?

答:在工程項目中新建一個cpp,記得添加到工程里。輸入如下代碼:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>

using namespace cv::xfeatures2d;
using namespace std;
using namespace cv;
// 計算圖像的SIFT特征及匹配
float cacSIFTFeatureAndCompare(cv::Mat srcImage1,
    cv::Mat srcImage2, float paraHessian)
{
    CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);
    // 轉換為灰度
    cv::Mat grayMat1, grayMat2;
    cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);
    cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY);
    // 初始化SIFT檢測描述子
    cv::Ptr<Feature2D> sift = xfeatures2d::SIFT::create();
    
    // 關鍵點及特征描述矩陣聲明
    vector<cv::KeyPoint> keyPoints1, keyPoints2;
    cv::Mat descriptorMat1, descriptorMat2;
        
    sift->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1);
    sift->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2);
    float result = 0;
    // 特征點匹配
    if (keyPoints1.size() > 0 && keyPoints2.size() > 0)
    {
        // 計算特征匹配點
        cv::FlannBasedMatcher matcher;
        vector< cv::DMatch > matches;
        std::vector<cv::DMatch> viewMatches;
        matcher.match(descriptorMat1, descriptorMat2, matches);
        // 最優匹配判斷
        double minDist = 100;
        for (int i = 0; i < matches.size(); i++)
        {
            if (matches[i].distance < minDist)
                minDist = matches[i].distance;
        }
        // 計算距離特征符合要求的特征點
        int num = 0;
        std::cout << "minDist: " << minDist << std::endl;
        for (int i = 0; i < matches.size(); i++)
        {
            // 特征點匹配距離判斷
            if (matches[i].distance <= 2 * minDist)
            {
                result += matches[i].distance * matches[i].distance;
                viewMatches.push_back(matches[i]);
                num++;
            }
        }
        // 匹配度計算
        result /= num;
        // 繪制特征點匹配結果
        cv::Mat matchMat;
        cv::drawMatches(srcImage1, keyPoints1,
            srcImage2, keyPoints2, matches, matchMat);
        cv::imshow("matchMat", matchMat);
        cv::waitKey(0);
    }
    return result;
}
int main()
{
    // 讀取源圖像及待匹配圖像
    cv::Mat srcImage1 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", 1);
    if (srcImage1.empty())
        return -1;
    cv::Mat srcImage2 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", 1);
    if (srcImage2.empty())
        return -1;
    float matchRate = cacSIFTFeatureAndCompare(srcImage1, srcImage2, 1000);
    std::cout << "matchRate: " << matchRate << std::endl;
    return 0;
}
OpenCV_SIFT

 

測試SURF代碼?

在工程項目中新建一個cpp,記得添加到工程里。輸入如下代碼:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>

using namespace cv::xfeatures2d;
using namespace std;
using namespace cv;

// 計算圖像的SURF特征及匹配
float cacSURFFeatureAndCompare(cv::Mat srcImage1,
    cv::Mat srcImage2, float paraHessian)
{
    CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);
    // 轉換為灰度
    cv::Mat grayMat1, grayMat2;
    cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);
    cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY);
    // 初始化SURF檢測描述子
    cv::Ptr<Feature2D> surf = xfeatures2d::SURF::create();
    
    // 關鍵點及特征描述矩陣聲明
    vector<cv::KeyPoint> keyPoints1, keyPoints2;
    cv::Mat descriptorMat1, descriptorMat2;
        
    surf->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1);
    surf->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2);
    float result = 0;
    // 特征點匹配
    if (keyPoints1.size() > 0 && keyPoints2.size() > 0)
    {
        // 計算特征匹配點
        cv::FlannBasedMatcher matcher;
        vector< cv::DMatch > matches;
        std::vector<cv::DMatch> viewMatches;
        matcher.match(descriptorMat1, descriptorMat2, matches);
        // 最優匹配判斷
        double minDist = 100;
        for (int i = 0; i < matches.size(); i++)
        {
            if (matches[i].distance < minDist)
                minDist = matches[i].distance;
        }
        // 計算距離特征符合要求的特征點
        int num = 0;
        std::cout << "minDist: " << minDist << std::endl;
        for (int i = 0; i < matches.size(); i++)
        {
            // 特征點匹配距離判斷
            if (matches[i].distance <= 2 * minDist)
            {
                result += matches[i].distance * matches[i].distance;
                viewMatches.push_back(matches[i]);
                num++;
            }
        }
        // 匹配度計算
        result /= num;
        // 繪制特征點匹配結果
        cv::Mat matchMat;
        cv::drawMatches(srcImage1, keyPoints1,
            srcImage2, keyPoints2, matches, matchMat);
        cv::imshow("matchMat", matchMat);
        cv::waitKey(0);
    }
    return result;
}
int main()
{
    // 讀取源圖像及待匹配圖像
    cv::Mat srcImage1 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", 1);
    if (srcImage1.empty())
        return -1;
    cv::Mat srcImage2 =
        cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", 1);
    if (srcImage2.empty())
        return -1;
    float matchRate = cacSURFFeatureAndCompare(srcImage1, srcImage2, 1000);
    std::cout << "matchRate: " << matchRate << std::endl;
    return 0;
}
OpenCV_SURF

 

注意:(1)選擇Debug,x64,運行代碼。

   (2)圖片的路徑!(我的圖片中設置的路徑是D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpgD:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg

參考:《OpenCV圖像處理編程實例》朱偉等著

 

Issue13:運行SIFT/SURF代碼錯誤?

答:若選擇Debug,x86報錯:LNK1104    無法打開文件“opencv_img_hash341d.lib”

原因:編譯時配置的是x64,而x86無法調用x64的包

解決:編譯時配置x86,但還未實驗,在前面的方案中配置x86失敗了,提示:模塊計算機類型“x64”與目標計算機類型“X86”沖突

  若選擇Release,x64報錯:發生生成錯誤,無法解析的外部符號。

原因:Issue10:配置新的工程中屬性管理器->Debug|x64->右擊Microsoft.Cpp.x64.user->屬性,只配置了Debug|x64

解決:配置新的工程中屬性管理器->Release|x64->右擊Microsoft.Cpp.x64.user->屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM