Python3.6.4+OpenCV3.4.0调用SIFT遇AttributeError问题求助
解决OpenCV 3.4.0 + Python 3.6.4 中找不到cv2.xfeatures2d的问题
我之前也碰到过一模一样的情况,结合你的环境配置,咱们一步步排查可能的原因:
版本必须严格匹配:OpenCV主库和opencv_contrib的版本必须完全一致,哪怕差一个小版本都会导致模块找不到。你用的是OpenCV 3.4.0,那opencv_contrib也得是3.4.0系列的。如果是用pip安装的,先卸载现有的contrib包,再指定版本安装:
pip uninstall opencv-contrib-python pip install opencv-contrib-python==3.4.0.12(注:PyPI上3.4.0对应的contrib包版本是3.4.0.12,和OpenCV 3.4.0完全兼容)
检查PyCharm的解释器环境:很多时候问题出在PyCharm没用到你安装了contrib的Python环境。打开
File > Settings > Project: [你的项目名称] > Project Interpreter,查看列表里的包:- 确认
opencv-python和opencv-contrib-python都存在 - 两者的版本都是3.4.0.x系列
如果没找到,点击右上角的+号,搜索这两个包并指定版本安装;或者确认解释器路径是不是你正在使用的Python 3.6.4的路径(比如虚拟环境路径)。
- 确认
源码编译的特殊配置(如果是手动编译的话):如果你是从源码编译OpenCV和contrib,那必须在编译时做两个关键设置:
- 指定contrib模块的路径:
-D OPENCV_EXTRA_MODULES_PATH=/path/to/opencv_contrib/modules - 开启非免费模块支持:
-D OPENCV_ENABLE_NONFREE=ON
因为SIFT属于非免费算法,在OpenCV 3.4.0中必须开启这个选项才能编译xfeatures2d模块。如果编译时没加这个参数,哪怕你把contrib源码放进去了,也会找不到xfeatures2d。
- 指定contrib模块的路径:
验证代码的导入方式:最后确认你的调用代码是正确的,正确的写法应该是:
import cv2 sift_detector = cv2.xfeatures2d.SIFT_create()先导入cv2主模块,再调用xfeatures2d下的SIFT_create方法,不要尝试直接导入子模块。
内容的提问来源于stack exchange,提问作者Jin Wook Paeng Gilbert
相关产品推荐
相关产品推荐

