如何安裝opencv_contrib及解決其安裝編譯問題

如何安裝opencv_contrib及解決其安裝編譯問題

1、背景

最近在實現一個基於opencv3的自動人臉識別項目,主要是使用了cv2.face模塊自帶的三種人臉識別演算法,分別是cv2.face.EigenFaceRecognizer_create()、cv2.face.FisherFaceRecognizer_create()以及cv2.face.LBPHFaceRecognizer_create(),這三個演算法一個比一個效果好,但是在運行代碼時,出現了如下問題:

AttributeError: module cv2.cv2 has no attribute face

網上搜索後,得知是因為cv2.face模塊因穩定性和測試不足問題沒有在opencv3庫上自帶,需要自己下載opencv3和opencv_contrib源代碼使用CMake和visual studio編譯!

2、下載CMake和opencv/opencv_contrib

根據提示,基於自身的環境一步一步的下載相關代碼:

環境:win10 x64 + python3.6.2

下載CMake:Download | CMake

(因網路原因後來我到百度上下載了CMake 3.8.0,已放在百度網盤:

鏈接: pan.baidu.com/s/1hseSqE 密碼: s23v)

下載opencv 3.3.0源代碼:OpenCV 3.3 - OpenCV library

百度網盤:鏈接: pan.baidu.com/s/1pKTiHv 密碼: kiu4

下載opencv_contrib源代碼:opencv/opencv_contrib

百度網盤:鏈接: pan.baidu.com/s/1nuXq3k 密碼: 1381

安裝CMake並解壓opencv和opencv_contrib source code到同一個文件夾上!

3、使用CMake生成opencv_contrib的python介面

此部分參考:用Cmake生成opencv_contrib的python介面 - u012900686的博客 - CSDN博客

我覺得步驟還是蠻簡單的:

3.1、選取opencv source目錄和build output目錄

如下圖:

1是opencv的source code路徑,2是CMake output(包括configure和generate)的目錄

3.2、第一次點擊左下角的Configure

這一步主要是根據opencv source code路徑下的CMakeLists.txt生成一些配置選項

如果看到CMake底部log輸出窗口輸出「Configuring done」則說明第一步成功了。

3.3、配置OPENCV_EXTRA_MODULES_PATH

這一步就是要配置opencv_contrib的路徑,以便生成opencv_contrib相關模塊的庫函數介面

找到OPENCV_EXTRA_MODULES_PATH,然後選擇opencv_contrib/modules所在路徑

C:UsersAdministratorDesktopuildopencvopencv_contrib-mastermodules

3.4、檢查是否包含有BUILD_opencv_python3

這一步就是要檢查是否包含BUILD_opencv_python3或BUILD_opencv_python2,這與個人系統環境是否包含python3或python2有關,為後來生成opencv_contrib的python介面做準備

對應目錄應該是C:UsersAdministratorDesktopuildopencvopencv-3.3.0modulespython

3.5、第二次點擊左下角的Configure

這一步根據之前配置的opencv_contrib path重新生成配置項

3.6、直接點擊左下角Generate生成visual studio項目文件

之前Configure時無錯誤則可直接等待幾分鐘生成visual studio文件

如果看到「Configure done」和「Generate done」字眼說明成功了。

4、解決CMake報錯CXX/C compiler unknown的問題

題主使用CMake時遇到如下問題:

The CXX compiler identification is unknown

The C compiler identification is unknown

從錯誤log來看就是C/C++編譯器找不到了,可是在第一次Configure時都會跳出如下選框選擇默認編譯器的。

注意:我發現一個規律,如果重新配置CMake的「where to build the binaries」 路徑,可以重新選擇編譯器版本,網上有些說需要重新安裝CMake來選擇編譯器其實是不需要的!

後來,我嘗試選了不同的編譯器,但是發現都無效,後來想想是不是自己沒有安裝visual studio啊(前段時間重裝了win10系統沒有安裝任何版本的visual studio),打開控制面板查看已安裝的程序,果然沒有安裝任何版本的visual studio!!!

折騰一番,安裝好visual studio後,選擇對應的visual studio版本,這次終於可以了!

5、使用visual studio生成帶有opencv_contrib介面的opencv庫

5.1 visual studio打開OpenCV.sln

CMake Genarate成功後,會在CMake output目錄下生成一堆東西,在根目錄下,找到OpenCV.sln,然後使用相應的visual studio打開載入該解決方案。

5.2、設定「配置管理器」

這一步主要是設定「解決方案」為「release」而不是「debug」

再visual studio界面:生成-->配置管理器-->「活動解決方案配置」由「debug」改為「release」

5.3、逐個編譯CMakeTargets

分別對INSTALL、ALL_BUILD以及BUILD_opencv_python3右鍵單擊」生成「,等待直到編譯完成無報錯信息,如果有報錯信息且是一些不太常用的模塊,則可到CMake界面配置項里將相應模塊去掉,即將相應的勾去掉不包含進來,如下是將ximgproc去掉,然後再重新來一遍,直到沒有任何報錯信息!

5.4、拿到cv2.cp36-win_amd64.pyd放到python安裝目錄下

visual studio編譯生成opencv python介面後,會在CMake output路徑下的libpython3Release生成帶有opencv_contrib介面的opencv庫文件,如cv2.cp36-win_amd64.pyd,將其放到相應的python安裝目錄lib/site-packet/cv2下即可使用!

比如ximgproc模塊報錯,那就到CMake里將BUILD_opencv_ximgproc配置項去掉!

如果在對「INSTALL」生成編譯過程中報如下錯誤:

50>C:UsersAdministratorDesktopuildopencvopencv_contrib-mastermodulesxfeatures2dsrcsift.cpp(1156): error C2039: 「removeDuplicatedSorted」: 不是「cv::KeyPointsFilter」的成員

50>C:UsersAdministratorDesktopuildopencvopencv-3.3.0modulesfeatures2dincludeopencv2/features2d.hpp(99): note: 參見「cv::KeyPointsFilter」的聲明

50>C:UsersAdministratorDesktopuildopencvopencv_contrib-mastermodulesxfeatures2dsrcsift.cpp(1156): error C3861: 「removeDuplicatedSorted」: 找不到標識符

則到類KeyPointsFilter查看確實沒有「removeDuplicatedSorted」這個介面,但是卻有「removeDuplicated」,所以將其修改成正確的介面,如下:

調用cv2函數庫時,如果提示「from .cv2 import * ImportError: DLL load failed: 找不到指定的模塊」,則需要使用Depends.exe查看dll依賴關係,如果缺少一些dll庫,可以安裝Visual C++ Redistributable for Visual Studio 2015(Visual C++ Redistributable for Visual Studio 2015)或者版本更高的reditexe試試!

後記:

以上是不是太折騰了,其實PyPI上早已幫我們編譯好相應安裝包了,執行一條語句即可完成安裝:pip install opencv-contrib-python

推薦閱讀:

解決 Windows 下 Python 安裝 Dlib 的問題:Cmake 找不到 boost
vs2017怎麼用內置CMAKE編譯opencv??
關於OpenCV的一次Debug
Ubuntu下邊用邊學CMAKE(一)

TAG:OpenCV | CMake | 人臉識別 |