本文仅针对Python进行讲解。
OpenCV在3.5版本以后因为版权问题,移除了SIFT和SURF工具,并整合入了opencv-contrib工具包中,但是,仅通过pip安装opencv-contrib-python是无法在python中使用的,需要用户自行将opencv-contrib编译进opencv中。
网络上有很多关于OpenCV + OpenCV-contrib的编译的文章,这些文章均是关于编译好后在VS中使用的,而不是关于Python的,对于Python,编译上还是有些坑的。
本文就对OpenCV+opencv-contrib共同编译后在Python中的安装,以及IDE中完美运行进行了讲解。
opencv和opencv-contrib源代码在官方GitHub上可以进行下载。
https://github.com/opencv
打开链接后,分别打开opencv和opencv_contrib。
选择版本:
下载zip:
下载可能会过慢,可以使用码云进行转存后下载,速度嗖嗖快。
opencv_contrib同理。
注意:opencv和opencv_contrib版本务必要一致。
直接去官网下载64位或32位最新版就行,推荐64位。
更多以及编译所需要的下载请阅读文章【OpenCV】opencv4.0.1+opencv_contrib4.0.1+VS2015的编译内的标题1和标题2,这里不过多赘述。
如果你的Python里装了opencv,请卸载,这点极其重要,可以用pip,也可以直接删除set-packages文件夹下的cv2文件夹。如果不删除,后面INSTALL时产生的cv2文件夹与pip安装的opencv产生的cv2文件夹发生冲突,使pip安装的cv2内发生覆盖,因为二者文件结构完全不同,布拉布拉的,反正就是用不了,会报错缺少DLL文件。
将原码全部解压,标题2所涉及到.cache文件夹也解压好,重命名并放到正确的位置。
我这里,build是编译后文件存储位置,down是标题2中引用文章中所提到的需要下载的依赖库临时下载位置,后面两个就是解压好的源代码。
打开CMake。
指定好opencv路径和编译文件存储路径(也就是build文件夹)。
点击Configure。弹出编译器设置列表,选择VS版本,位数,这里选择VS2017,64位。
点击Finish,等待片刻,会出现一片姨妈红的配置列表。如果你已经事先手动下载好了标题2内引用连接所提到的相关依赖库,会比较顺利,否则编译器会自动下载,你将有90%的概率下载失败而编译失败,基本上还是自己手动下载吧。最下方日志栏会有Configuring字样,如果报错会有红色的错误信息。
现在开始配置。
·在列表内找到以下内容:
BUILD_opencv_world、OPENCV_NONFREE、OPENCV_FORCE_PYTHON_LIBS这三个全部打上对勾。
·在列表找到以下内容:
OPENCV_GENERATE_STEPVARS、OPENCV_PYTHON3_VERSION全部取消对勾。
OPENCV_NONFREE不打对勾在使用SIFT时会报错;
OPENCV_PYTHON_VERSION如果选中会导致VS在生成时python不通过编译彻底失败;
OPENCV_GENERATE_STEPVARS这个没什么用,不影响编译,打上对勾CMake编译时会报错飘红,看着难受;
其他为什么要选中网上很多文章有讲解。
·检查Python解释器路径,Python的set-packages路径,如果Python安装了Debug版本检查Debug版本路径,如果电脑内有IronPython2.7,将Python2相关的全部清空,否则会编译报错。
·找到OPENCV_EXTRA_MODULES_PATH,将opencv_contrib内的modules路径填进去。
再次点击Cconfigure,等待片刻,配置列表会变白色,如果还是有姨妈红,则多点几次Configure,一般需要点2次。
都变白之后,日志结尾有Configuring done字样,而后点击Generate,等待片刻出现Generating done字样。
点击Open Project按钮,打开Visual Studio2017,工程会自动加载。
等待工程加载完毕(看左下角,这工程尼玛几万个文件我真的是服了)完全加载完毕后,将解决方案改为Release x64(要跟CMake最开始编译时选择编译器版本位数一致,否则编译不过)
在解决方案对话框内找到CMakeTargets文件夹下的INSTALL,右键,生成(或者重新生成)。也可以先先用ALL_BUILD生成,然后再INSTALL,都可以,两个各半个小时左右,自己看着办就好。
然后等个半个小时就可以了。期间会出现WARNING,这是字符编码警告,忽略即可,出现红色的ERROR就得查错了。
现在在Python的set-packages下已经有cv2文件夹了,说明安装成功。这个时候已经可以使用了,可以自己试一下。
但这里需要说明几个坑(放心,会填上的):
1、如果你使用第三方IDE,例如PyCharm,导入cv2后,是不会有自动补全的,极其难受,网上说把import cv2改成import cv2.cv2,这里是不行的,那种方法仅针对pip安装版本,这种自己编译的版本文件结构和正常pip安装的文件结构不同,导致了包内init.py与pip版的不同,如果import cv2.cv2,直接报错找不到module。
解决办法:找到cv2内的python-3.7文件夹下的pyd文件,复制到set-packages文件夹下,注意是复制,不是移动,然后改名为cv2,就好了,是不是很简单哈哈哈哈哈哈。
这样就看到PyCharm里已经可以使用SIFT和SURF算法了。
2、与pip版不同的是,编译版不配有各种眼部面部嘴巴什么的各种xml文件,其实这一堆文件在opencv源代码文件夹里,打开opencv源代码文件夹,找到data,可以看到data里面都是你想要的xml,把data文件夹复制到cv2里即可。