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 3.8.0,已放在百度网盘:
安装CMake并解压opencv和opencv_contrib source code到同一个文件夹上!
3、使用CMake生成opencv_contrib的python接口
我觉得步骤还是蛮简单的:
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:UsersAdministratorDesktopbuildopencvopencv_contrib-mastermodules
3.4、检查是否包含有BUILD_opencv_python3
这一步就是要检查是否包含BUILD_opencv_python3或BUILD_opencv_python2,这与个人系统环境是否包含python3或python2有关,为后来生成opencv_contrib的python接口做准备
对应目录应该是C:UsersAdministratorDesktopbuildopencvopencv-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:UsersAdministratorDesktopbuildopencvopencv_contrib-mastermodulesxfeatures2dsrcsift.cpp(1156): error C2039: “removeDuplicatedSorted”: 不是“cv::KeyPointsFilter”的成员
50>C:UsersAdministratorDesktopbuildopencvopencv-3.3.0modulesfeatures2dincludeopencv2/features2d.hpp(99): note: 参见“cv::KeyPointsFilter”的声明
50>C:UsersAdministratorDesktopbuildopencvopencv_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