由於最近需要使用OpenCV,本人需要在自己的PC上使用OpenCV,因此最近一直在研究如何使用Visual Studio編譯OpenCV源代碼並搭建開發環境,折騰了很長時間,查閱了很多相關資料,終於成功。本文記錄一下安裝的過程以及遇到的問題,僅供參考。開篇吐槽一下博客園的博文【自動保存和恢復】功能,說白了就是可以自動保存,但是幾乎不能自動恢復,不要問我為什么這么說,呵呵。
本PC環境的詳細配置:Windows 10 16299.192 64-bit,Visual Studio Enterprise 2017 15.5.2,OpenCV-3.4.0-vc14_vc15,CMake 3.10.1,CUDA 9.0
開始正式介紹安裝步驟:
(1)下載並安裝Visual Studio 2017。由於本PC上安裝的是最新的Visual Studio 2017企業版,因此本人主要研究如何在最新版的VS上編譯並部署opencv開發環境。如果各位搞不到Visual Studio 2017企業版的激活碼,那么使用社區版也是沒有問題的。首先到官方網站下載Visual Studio 2017並安裝。在Visual Studio Installer中,勾選和C++開發相關的所有組建,並且確保安裝過程順利無誤,這一點非常重要,因為必須確保VC++編譯環境正確安裝。這里提醒一下,注意VS2017的版本號為15,因此對應的VC++編譯環境的版本號為vc15,這個很重要,將決定opencv版本的安裝。
(2)下載並安裝OpenCV。從官網下載OpenCV,本人使用的是最新版OpenCV-3.4.0-vc14_vc15,請注意,這里要下載支持vc15的版本,才能很好的兼容Visual Studio 2017,本人曾看一些博客寫到用vc14(對應Visual Studio 2015)的版本在Visual Studio 2017中使用,親測,毛病有不少。安裝過程沒什么太多好說,比較簡單。為了求穩,安裝目錄設為C:/OpenCV,目錄中全英文且不包含任何空格符。PS:這個版本是在12月23日發布的,聖誕禮物喲。
(3)下載並安裝CMake。從CMake官網上下載最新版的CMake。因為本人使用的環境是比較新的,因此需要使用新的CMake來保證兼容性。
(4)使用CMake創建OpenCV.sln。為了實現OpenCV的本地編譯,首先要使用CMake創建OpenCV.sln,然后再使用VS2017進行編譯,生成庫文件。首先啟動CMake,選擇OpenCV的源代碼目錄和build目錄,然后點擊【Configure】,CMake開始執行配置,開始前,要選擇正確的編譯器,本PC上安裝的是Visual Studio 2017 15.5.2,因此選擇Visual Studio 15 2017 Win64.此時點擊【Finish】,配置過程開始。只要OpenCV和CMake下載安裝不出問題,一般來說這個過程是不會報錯的,如果出錯導致配置失敗,則需要查閱日志文件,解決問題。這里說明一點,在Configure過程中,需要聯網自動下載三個文件,可能會由於網絡的問題導致下載不下來,如果由於該問題導致配置失敗,可以通過重新配置的方法解決該問題,實在不行,可以去網上找這三個文件,手動下載。
在配置過程結束后,如果成功,則會在日志框里顯示【Configuring done】,中間的配置框會變紅,顯示配置項。在這里,要手動勾選兩項【BUILD_EXAMPLES】和【BUILD_opencv_world】,然后再點擊【Configure】,再次執行配置。不出意外的話,這個過程會很快完成,配置框變為白色。該步驟完成。本人在這里遇到了一個巨大的坑:本人的PC上安裝了CUDA 9.0,不知道是沒安裝好還是兼容性問題,在成功生成OpenCV工程文件后,使用VS2017編譯源代碼,總是失敗,折騰了兩天時間。經過查閱編譯日志(這里忘了截圖),發現是CUDA編譯器的問題,經過摸索,發現將BUILD_CUDA相關的項目勾選去掉,然后重新生成sln,解決了問題。后來我重裝了系統,沒有安裝CUDA,則正常安裝即可,可忽略這個步驟。
(5)生成OpenCV.sln。配置完成后,點擊【Generate】,生成VS工程文件。這個過程一般不需要太多時間,只要之前的過程沒出錯,這里一般不會有問題。
(6)使用VS2017編譯OpenCV源代碼。點擊【Open Project】按鈕,CMake會啟動VS2017並加載OpenCV.sln。加載過程可能要一點時間(相對於一般小規模項目而言),需要耐心等待。加載完成后,點擊【生成】,選擇【批生成】,然后只勾選INSTALL那兩項,其他項目不勾選,然后開始生成。這個過程比較久,需要耐心等待,本PC上跑了50分鍾。
Build成功后,在C:\OpenCV\build\install\x64\vc15\bin目錄下會生成相應的動態庫。如果有失敗的,要查閱輸出日志,具體問題具體解決。到此,本地編譯OpenCV的工作就全部做完了。
(7)配置OpenCV環境變量。右擊【此電腦 -> 屬性 -> 高級系統設置 -> 環境變量 -> 系統變量 -> 編輯Path -> 新建】,添加環境變量C:\OpenCV\build\install\x64\vc15\bin。這個步驟不難,網上有很多教程。
(8)新建工程並測試。在VS2017中新建一個空的C++項目。在【屬性管理器】中選中【Debug | x64->Microsoft.Cpp.x64.user】並右擊彈出菜單,選擇【屬性】。
選擇【C/C++ -> 常規 -> 附加包含目錄】,添加如下三個目錄:
再選擇【鏈接器 -> 附加庫目錄】,添加如下目錄:
再選擇【鏈接器 -> 輸入 -> 附加依賴項】,添加如下庫文件名:
點擊【確定】,【應用】。
創建一個cpp文件,並添加如下測試代碼:
1 #include <opencv2\opencv.hpp> 2 3 using namespace cv; 4 5 int main(int argc, char** argv) 6 { 7 Mat img = imread("C:\\Users\\lzhuc\\source\\repos\\opencv_test\\x64\\Debug\\lena.jpg"); 8 imshow("img", img); 9 waitKey(0); 10 return 0; 11 }
編譯,運行,效果如下:
本人測試發現,如果配好了環境直接運行,會報錯,發現img為空,是個0x0的矩陣,重啟一下系統,就可以了。
參考資料:
http://blog.csdn.net/rrrfff/article/details/76796261
http://blog.csdn.net/u013832707/article/details/53127710
http://blog.csdn.net/poem_qianmo/article/details/21974023
http://blog.csdn.net/paulhappy/article/details/52107121
2019年12月1日,在一個更新的環境中編譯安裝OpenCV:
Windows 10 18363.476 64-bit,Visual Studio Enterprise 2017 15.9.17,OpenCV-4.1.2,CMake 3.16.1
步驟和上文中完全一致。有個小坑,在用CMake生成sln的過程中的configuatio步驟,遇到【無法打開文件“MSVCRTD.lib”】的問題。解決方案是,在Visual Studio Installer中,安裝C++ for spectre組件,如下圖:
裝完,重新啟動CMake,再從頭開始,一切OK。
按照上述步驟,在VS中測試時,發現編譯通不過,報錯【無法打開文件opencv_world412d.lib】,慌了一波,檢查了一下,發現時在鏈接器配置中的【附加依賴項】寫錯了,寫成了opencv_world412d.dll,改成.lib即可。
在VS 2017中編譯過程中,生成x86項目沒有問題,但是生成x64項目的時候,失敗了一個,如下:
------ 已啟動生成: 項目: opencv_python3, 配置: Release x64 ------
Building Custom Rule C:/OpenCV/opencv-4.1.2/modules/python/python3/CMakeLists.txt
cv2.cpp
正在創建庫 C:/OpenCV/opencv-4.1.2/build/lib/Release/opencv_python3.lib 和對象 C:/OpenCV/opencv-4.1.2/build/lib/Release/opencv_python3.exp
opencv_python3.vcxproj -> C:\OpenCV\opencv-4.1.2\build\lib\python3\Release\cv2.cp36-win_amd64.pyd
------ 已啟動生成: 項目: opencv_python3, 配置: Debug x64 ------
Building Custom Rule C:/OpenCV/opencv-4.1.2/modules/python/python3/CMakeLists.txt
cv2.cpp
LINK : fatal error LNK1104: 無法打開文件“python36_d.lib”
已完成生成項目“opencv_python3.vcxproj”的操作 - 失敗。
發現是安裝python3.6的時候沒有帶入debug庫,解決方案如下:
在【解決方案資源管理器】中,找到【binding】目錄,找到【opencv_python3】項目,在【外部依賴項】中找到【pyconfig.h】文件,修改其中兩個地方
1、將【# define Py_DEBUG】注釋掉,如下
2、將【pragma comment(lib,"python36_d.lib")】改為【pragma comment(lib,"python36.lib")】,如下
修改完成后,在解決方案上右鍵點擊【生成解決方案】,即可重新將生成失敗的方案重新生成,如下
一切OK!
參考
https://blog.csdn.net/Huntercao/article/details/84555201