本文主要講述opencv及opencv_contrib庫在windows下基於vs2017編譯安裝指南。所用OpenCV版本爲OpenCV4.4,編譯平臺爲vs2017。
在OpenCV的github倉庫下載對應版本檔案。鏈接地址爲:
OpenCV倉庫
在OpenCV_contrib的githuc倉庫下載對應版本檔案。鏈接地址爲:
OpenCV_contrib倉庫
注意OpenCV版本和OpenCV_contrib版本必須一致
然後將OpenCV解壓後的檔案目錄opencv-4.4.0放入某個目錄下,比如我的放入D槽opencv_440_contrib目錄下,然後將OpenCV_contirb解壓後的資料夾opencv_contrib-4.4.0放入opencv-4.4.0目錄,在opencv-4.4.0目錄下建立build目錄,用於儲存編譯檔案。具體檔案結構如下:
- d:/opencv_440_contrib
- opencv-4.4.0
- ...
- build
- opencv_contrib-4.4.0
- ...
具體目錄如圖所示:
開啓cmake-gui,設定OpenCV標準庫。cmake安裝地址爲:https://cmake.org/download/
開啓後的cmake-gui設定原始碼目錄地址和生成檔案地址,點選configure。如圖所示:
然後設定編譯器,選擇對應其的編譯器版本,然後選擇編譯平臺版本。x64 or win32。然後點選finish,cmake將會自動編譯檔案。
在編譯過程會出現如下情況,比如下載ippicv和ffmpeg。有時下載可能會失敗。
通用的解決方式是離線下載,然後代替檔案。要下載的檔案可以開啓D:\opencv_440_contrib\opencv-4.4.0.cache目錄,檢視哪些目錄下有大小爲0kb的檔案,提取該檔案的名字,下載對應的檔案並改名替換源0kb檔案。如下所示:
當然要下載的檔案獲得主要有三種辦法:
這裏具體講一講如何通過官方第三方庫下載,首先進入opencv_3rdparty倉庫
然後搜尋對應檔案版本下載即可,如圖所示:
如果沒有找到下載的檔案,就開啓D:\opencv_440_contrib\opencv-4.4.0\build\CMakeDownloadLog.txt檔案,裏面有下載檔案的具體鏈接。然後通過第三方工具下載。CMakeDownloadLog.txt內容如下圖所示:
當.cache目錄無0kb檔案,cmake-gui中繼續執行configure。執行完之後需要檢視底部視窗是否有紅色提示。可能會出現OpenCVGenSetupVars.cmake:54,如下圖所示:
解決辦法爲去除OPENCV_GENERATE_SETUPVARS選項,參考去除OpenCVGenSetupVars.cmake:54如下圖所示。然後再繼續點選configure。
如果上一步驟完成,在cmake搜尋方塊中搜尋OPENCV_EXTRA_MODULES_PATH,並將其值設定成opencv_contrib資料夾中的modules,然後再點選configure,如下圖所示:
編譯過程如出現要下載第三方庫,網路問題會失敗,如圖所示:
編譯contrib庫需要的第三方庫檔案具體有:
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
face_landmark_model.dat
解決辦法就是離線下載這些檔案,將這些檔案複製到opencv_contrib/modules/xfeatures2d/src/目錄下,如下圖所示。具體如何下載檔案,網路搜尋對應檔名或者檢視build資料夾下的CMakeDownloadLog.txt檔案提取下載鏈接,或者檢視如下檢視文章:
https://blog.csdn.net/u011736771/article/details/85960300
https://blog.csdn.net/AlexWang30/article/details/99612188
https://github.com/opencv/opencv_contrib/issues/1301
然後繼續點選configure。可能某些版本還是出現檔案下載錯誤,就把以上檔案複製到.cache資料夾,修改名字。類似上一步設定OpenCV標準庫一樣,就可以設定成功。另外要注意的face_landmark_model.data檔案很大約70MB,位於.cache/data目錄下,最好離線下載。
檢查.cache檔案中是否存在0kb檔案,安裝記錄是否報錯。如果都正常,至此檔案設定基本完成。如下圖所示:
點選generate,然後可以跳過2.3節,檢視2.4可以直接編譯檔案,但是建議看看2.3OpenCV需求設定,以加快OpenCV編譯速度和提高後期OpenCV使用體驗。
本節主要是爲了加快OpenCV編譯速度和提高後期OpenCV使用體驗。
首先搜尋world,勾選BUILD_opencv_world。BUILD_opencv_world勾選的作用就是生成opencv_world.lib檔案,在使用的時候,直接在附加依賴項新增opencv_world.lib就可以,主要是爲了方便。沒有打包的話,需要新增其它所有的lib檔案。如圖所示:
然後搜尋nonfree,勾選OPENCV_ENABLE_NONFREE,這一項的作用就是使用非免費庫。當然也可以不選,一般很少用。如圖所示:
然後點選configure生成即可。
編譯過程中,如果直接進編會譯出一堆測試檔案(_test_xxx)和效能測試檔案(_perf_xxx),以及一些example例子。可以直接去除。
BUILD_EXAMPLES
BUILD_TESTS
BUILD_PERF_TESTS
BUILD_DOCS
Python相關編譯可以去除,一般不編譯Python庫。
BUILD_opencv_python2
BUILD_opencv_python3
BUILD_opencv_python_bindings_generator
BUILD_opencv_python_tests
不同環境選項可能不同,搜尋python即可。然後去除勾選,如下圖所示:
此外如果不是編譯java庫,可以去除java編譯選項。
BUILD_java
BUILD_opencv_java_bindings_generator
不同環境選項可能不同,搜尋java即可。然後去除勾選,如下圖所示:
所有選項設定後,直接configure,檢視是否標紅而且.cache是否有0kb檔案,然後generate,成功後開啓OpenProject即可。 如下圖所示:
開啓後的vs2017介面如下圖所示,確定編譯平臺爲debug/x64,
然後點選生成-生成解決方法即可,如下圖所示。這樣的好處是知道哪些模組生成失敗。如果有生成譯錯誤,檢查即可。這一過程約10分鐘到40分鐘,不同機器時間不一樣。
生成成功後,如下圖所示:
如果生成後沒有失敗的,選擇解決方案-CMakeTargets-INSTALL-僅用於專案-僅生成INSTALL,如下所示。就可以生成opencv_world440d.lib檔案。提示成功後就可以在build資料夾下看到install資料夾。
此外以上操作只能生成OpenCV Debug版本。Release版本需要修改設定平臺,重複以上操作。如下圖所示:
最後如果生成了install資料夾,而且該資料夾下x64/vc15/lib目錄下有對應的lib檔案表明生成成功。如下圖所示。install就是我們編譯最後要使用的檔案。
如果是Python環境,不需要編譯OpenCV contrib庫,直接pip安裝即可,命令如下:
pip install opencv-contrib-python
如果是linux平臺參考如下文章:
https://blog.csdn.net/haoqimao_hard/article/details/82049565
爲了設定好OpenCV,個人習慣將上一步的install檔案移到opencv_440_contrib目錄下,並且重新命名爲build(以前使用直裝版的習慣)。如圖所示:
然後新建vs2017專案,然後選擇屬性管理器,新建屬性列表opencv_440如圖所示。這樣該opencv_440屬性列表以後可以重複匯入使用,不需要每次新建工程都設定。
修改Debug|X64模式下的opencv_440屬性,修改VC++目錄下的可執行目錄,包含目錄,庫目錄。如下圖所示:
可執行檔案目錄設定如下,其中vc15指的是編譯平臺,vc15就是vs2017。按照自己的編譯平臺選擇資料夾。
d:\opencv_440_contrib\build\x64\vc15\bin
包含目錄設定如下,新增標頭檔案,但是要注意的是有些OpenCV版本下include目錄有opencv目錄,需要新增include\opencv目錄,該版本只有opencv2目錄,就不需要新增opencv目錄了。
d:\opencv_440_contrib\build\include
d:\opencv_440_contrib\build\include\opencv2
庫目錄設定如下,其中vc15指的是編譯平臺。
d:\opencv_440_contrib\build\x64\vc15\lib
然後修改鏈接器-輸入-附加依賴項,如下圖所示:
附加依賴項設定如下。如果是debug版本就加d,release版本就去掉d。
opencv_world440d.lib
測試程式碼如下:
// 生成aruco標誌
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
using namespace cv;
// 用於生成aruco圖示
int main()
{
Mat markerImage;
// 生成字典
Ptr<cv::aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
// 生成影象
// 參數分別爲字典,第幾個標識,影象輸出大小爲200X200,輸出影象,標記邊框的寬度
aruco::drawMarker(dictionary, 33, 200, markerImage, 1);
imwrite("marker33.png", markerImage);
return 0;
}
該程式碼主要基於OpenCV中的contrib/aruco模組生成aruco圖示,將在執行檔案目錄下生成名爲marker33.png的圖片。如下圖所示。如果成功生成marker33圖片,表明opencv編譯成功,能夠使用contrib庫。