我正在尝试使用 MSYS / MinGW 构建 OpenCV,以便可以在 python 中使用 cv2 模块。我在 Windows 7 64 位并使用 32 位 Python 2.7。构建 OpenCV 可以工作,但如果没有收到“ImportError:DLL 加载失败:找不到指定的模块”,我似乎无法使用它。导入 cv2 后。调试了一段时间,google常见的解决方案好像不行。
这些是我采取的步骤:
- 从我的计算机中删除了所有其他 opencv 实例(有一些)
用 CMake 构建了 opencv,我手动设置了这些标志:
'CMAKE_INSTALL_PREFIX' : 'C:/Program Files (x86)/OpenCV' 'CMAKE_BUILD_TYPE' : 'Release', 'CMAKE_C_FLAGS' : '-m32', 'CMAKE_CXX_FLAGS' : '-m32', 'BUILD_opencv_gpu' : False, 'BUILD_opencv_gpuarithm' : False, 'BUILD_opencv_gpubgsegm' : False, 'BUILD_opencv_gpucodec' : False, 'BUILD_opencv_gpufeatures2d' : False, 'BUILD_opencv_gpufilters' : False, 'BUILD_opencv_gpuimgproc' : False, 'BUILD_opencv_gpuoptflow' : False, 'BUILD_opencv_gpustereo' : False, 'BUILD_opencv_gpuwarping' : False
我做了一个 cmake -G "MSYS Makefiles" ...,make -j9,最后是 make install。打印输出显示图书馆去我期望的地方。
我的路径包括
C:\MinGW\bin C:\MinGW\msys\1.0\bin C:\MinGW\libexec\gcc\mingw32\4.6.2 C:\Python27\ C:\Python27\Scripts C:\Program Files (x86)\OpenCV C:\Program Files (x86)\OpenCV\lib
我的 PYTHONPATH 包括
C:\Python27\Lib\site-packages C:\Python27
然后我复制
C:\Python\Lib\site-packages 中的 cv2.pyd 和 libcv2.dll.a
所有 libopencv_*249.dll.a 来自 C:\Program Files (x86)\OpenCV\lib
libgcc_s_dw2-1.dll libstdc++-6.dll 来自 C:\MinGW\bin
我将所有这些移动到我命名为 cv2 的目录中
在 cv2 目录中,我创建了一个 __init__.py 文件,其中包含以下代码:
import os, sys from os.path import realpath, dirname tpl_cv2 = realpath(dirname(__file__)) print(tpl_cv2) sys.path.insert(0,tpl_cv2) os.environ['PATH'] = tpl_cv2 + os.pathsep + os.environ['PATH'] try: from cv2 import * except Exception as ex: print(repr(ex)) print(os.environ['PATH']) print(sys.path) raise
然后我打开一个 IPython 终端并输入命令“import cv2”
我得到错误: ImportError('DLL load failed: The specified module could not be found.',)
要调试这个我有:
- 我在depends.exe中加载了cv2.pyd文件它表明
未找到 LIBOPENCV_CALIB3D249.DLL 和所有其他 opencv 库。但是,这些都与 cv2.pyd 以及 PATH 和 PYTHONPATH 位于同一目录中。
但是它们被命名为 .dll.a 因为我是用 MSYS / MinGW 编译的。我不明白为什么要寻找没有 .a 后缀的 .dll 。我认为这可能与错误有关,但我不知道从哪里开始。
我还构建了一个小型 C++ 应用程序,它使用我构建的 OpenCV 读取和成像。它构建得很好,但我收到错误:程序无法启动,因为您的计算机缺少 libopencv_core249.dll。所以,我更相信这个 .dll.a 是问题所在。
我试过简单地将库从 .dll.a 重命名为 .dll,但这没有用。
我希望有人可以阐明这个问题。