如何安裝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,已放在百度網盤:
鏈接: https://pan.baidu.com/s/1hseSqEC 密碼: s23v)
下載opencv 3.3.0源代碼:OpenCV 3.3 - OpenCV library
百度網盤:鏈接: https://pan.baidu.com/s/1pKTiHv1 密碼: kiu4
下載opencv_contrib源代碼:opencv/opencv_contrib
百度網盤:鏈接: https://pan.baidu.com/s/1nuXq3kH 密碼: 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(一)