[常用工具] OpenCV_contrib庫在windows下編譯使用指南

2020-08-11 20:53:25

本文主要講述opencv及opencv_contrib庫在windows下基於vs2017編譯安裝指南。所用OpenCV版本爲OpenCV4.4,編譯平臺爲vs2017。

1 下載

在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
            - ...

具體目錄如圖所示:

2 編譯與安裝

2.1 設定OpenCV標準庫

開啓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檔案。如下所示:

當然要下載的檔案獲得主要有三種辦法:

  • 搜尋引擎搜尋檔案進行下載
  • 替換下載鏈接,但是可能會失敗。具體見windows下OpenCV庫安裝
  • 官方第三方庫地址下載(最穩妥)

這裏具體講一講如何通過官方第三方庫下載,首先進入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。

2.2 設定OpenCV_contrib庫

如果上一步驟完成,在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使用體驗。

2.3 OpenCV需求設定

本節主要是爲了加快OpenCV編譯速度和提高後期OpenCV使用體驗。

2.3.1 設定優化編譯選項

首先搜尋world,勾選BUILD_opencv_world。BUILD_opencv_world勾選的作用就是生成opencv_world.lib檔案,在使用的時候,直接在附加依賴項新增opencv_world.lib就可以,主要是爲了方便。沒有打包的話,需要新增其它所有的lib檔案。如圖所示:

然後搜尋nonfree,勾選OPENCV_ENABLE_NONFREE,這一項的作用就是使用非免費庫。當然也可以不選,一般很少用。如圖所示:

然後點選configure生成即可。

2.3.2 去除不必要選項

編譯過程中,如果直接進編會譯出一堆測試檔案(_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即可。 如下圖所示:

2.4 編譯OpenCV

開啓後的vs2017介面如下圖所示,確定編譯平臺爲debug/x64,

然後點選生成-生成解決方法即可,如下圖所示。這樣的好處是知道哪些模組生成失敗。如果有生成譯錯誤,檢查即可。這一過程約10分鐘到40分鐘,不同機器時間不一樣。

生成成功後,如下圖所示:

如果生成後沒有失敗的,選擇解決方案-CMakeTargets-INSTALL-僅用於專案-僅生成INSTALL,如下所示。就可以生成opencv_world440d.lib檔案。提示成功後就可以在build資料夾下看到install資料夾。

此外以上操作只能生成OpenCV Debug版本。Release版本需要修改設定平臺,重複以上操作。如下圖所示:

最後如果生成了install資料夾,而且該資料夾下x64/vc15/lib目錄下有對應的lib檔案表明生成成功。如下圖所示。install就是我們編譯最後要使用的檔案。

2.5 其他平臺與語言環境的OpenCV_contrib庫使用

如果是Python環境,不需要編譯OpenCV contrib庫,直接pip安裝即可,命令如下:

pip install opencv-contrib-python

如果是linux平臺參考如下文章:

https://blog.csdn.net/haoqimao_hard/article/details/82049565

3 設定與使用

3.1 設定

爲了設定好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

3.2 測試

測試程式碼如下:

// 生成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庫。

4 參考

4.1 官方倉庫

4.2 參考文件