1.源碼下載
OpenCV:https://github.com/opencv/opencv
contrib:https://github.com/opencv/opencv_contrib
注意本體和contrib的版本匹配,詳見以下:
默認的是“master”分支,我們需要點擊“Branch:master”按鈕,點擊“Tags”標簽,在下拉列表中選擇想要的版本。本文以4.1.0為例。
本體和擴展模塊選擇同樣的分支:
選擇“Download ZIP”下載到本地
2.CMake首次設置
CMake下載地址:https://cmake.org/download/
1)打開CMake,設置好OpenCV本體源碼所在路徑,以及存放生成的工程的目標路徑
正確的源碼路徑如下圖,包含一個CMakeList.txt文件,根據自己存放的位置進行設置。
注意:
路徑中不能有中文
確保目標路徑的硬盤剩余空間在18G以上
2)點擊“Configure”
3)選擇編譯器:
當前版本不支持用vs 2019編譯,選擇2017。
4)在第二欄選擇編譯器架構,這里選擇64位(x64)。要根據自己硬件架構進行選擇:32位兼容性好(win32),64位速度快,arm架構的硬件要選擇arm。
(注:老版本的CMake在上一步就會選擇編譯器架構)
5)點擊“完成”進行第一次編譯。這次編譯可能會報錯,但不用去管。我們會發現出現了很多紅色背景的選項。
3.在CMake中進行contrib擴展模塊等的詳細設置
1)找到“OPENCV_EXTRA_MODULES_PATH”。(可在“Search”欄中直接搜索)
點擊右側的省略號選擇下載的contrib源碼中,“modules”文件夾的路徑(注意不是contrib的主目錄)。
該路徑是下面這樣的:
2)可選項:
a.如果需要使用surf特征檢測之類的有專利的算法,需要勾選"OPENCV_ENABLE_NONFREE”:
b.可勾選“BUILD_opencvv_world”,這樣最后的庫是一個文件,引用更簡便。
c.根據自身python版本和需要選擇性勾選“BUILD_opencv_python2”,“BUILD_opencv_python3”
3)再次點擊“Configure”。這次確保不會有紅色的報錯。
4.Download failed錯誤處理
最常見的錯誤應當是“Download failed”。這要歸功於the wall。於是需要用一定手段手動下載。我們可以用以下方法獲取到下載地址。
以ffmpeg下載失敗為例:
報錯信息形如下圖,我們看到“Download failed”字樣,確認是下載失敗。
在報錯信息上方我們可以找到下載失敗的文件名opencv_ffmpeg.dll。
在下方Call Stack中可以找到ffmpeg庫的.cmake文件路徑:
用notepad或記事本打開ffmpeg.cmake,找到如下字段:
我們可以看到下載的URL: https://raw.githubusercontent.com/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/
其中 ${FFMPEG_BINARIES_COMMIT} 字段的內容可以在前面的代碼中找到:
於是我們得到了下載的base url: https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/
我們再看這段代碼,它在一個foreach循環中:
通過之前的代碼我們可以看到ids的元素,是BIN32,BIN64,CMAKE,並且緊接着定義了name_BIN32, name_BIN64, name_CMAKE
再看循環體中的代碼
我們可以明白它是分別下載了這三個文件:
於是我們將他們分別和之前得到的base url拼接成了三個下載地址:
分別粘貼到瀏覽器中下載到自定文件夾。(其中的cmake文件可能不會自動下載,需要在頁面中右鍵點“另存為”)
回到剛才那個cmake文件,我們將網址那行代碼注釋掉,替換成剛剛存放下載文件的目錄:
保存后,再次點擊“Configure”。可以看到ffmpeg不再報錯:
其他庫下載失敗的問題可以用同樣的方法解決。
5. 編譯生成
第二次“Configure”成功后,點擊“Generate”,然后用對應版本的vs打開生成的工程。
然后在vs中選擇Build(生成)->Batch Build(批生成)。
在彈出的窗口中勾選ALL_BUILD和INSTALL兩個項目的Debug和Release版,點擊Build(生成)。
大約半小時后,編譯完成:
編譯結果在install文件夾中:
include裝着頭文件,x64包含64位庫。OpenCV源碼編譯完成。