平台: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; }
測試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; }
注意:(1)選擇Debug,x64,運行代碼。
(2)圖片的路徑!(我的圖片中設置的路徑是D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg和D:/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->屬性