当我在python3.7.3上运行时,为什么会收到针对opencv2的ImportError?

时间:2019-07-17 06:12:32

标签: python-3.x macos opencv

我试图在Mac OS 10.10上使用python3.7.3导入opencv2,但是发生ImportError。我该怎么解决?

我尝试使用pip,pip3和homebrew安装opencv3。可能没有正确安装。

import cv2
import numpy as np
import sys
import pytesseract as py
import matplotlib.pyplot as plt

错误

Traceback (most recent call last):
  File "/Users/wujian/Desktop/Project/Proj.py", line 1, in <module>
    import cv2
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cv2/cv2.cpython-37m-darwin.so, 2): Symbol not found: _clock_gettime
  Referenced from: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cv2/.dylibs/libavutil.56.22.100.dylib (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib
 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cv2/.dylibs/libavutil.56.22.100.dylib

1 个答案:

答案 0 :(得分:0)

该问题似乎(单方面)与您的 libavutil 副本有关,该副本是 ffmpeg 的一部分。

错误消息的这一部分提示了此信息:

ImportError: dlopen(/.../cv2/cv2.cpython-37m-darwin.so, 2): Symbol not found: _clock_gettime
  Referenced from: /...python3.7/site-packages/cv2/.dylibs/libavutil.56.22.100.dylib (which was built for Mac OS X 10.12)

安装 OpenCV 需要 ffmpeg 。如果您安装了via homebrew,它将列为依赖项。

$ brew info opencv
...
==> Dependencies
Build: cmake ✓, pkg-config ✓
Required: eigen ✓, ffmpeg ✓, glog ✓, ...

安装 ffmpeg 将包含 libavutil 库,可以通过by downloading pre-built shared librariesby Homebrew进行检查:

$ brew list ffmpeg | grep libavutil.*dylib
/usr/local/Cellar/ffmpeg/4.1.4_1/lib/libavutil.56.22.100.dylib
/usr/local/Cellar/ffmpeg/4.1.4_1/lib/libavutil.56.dylib
/usr/local/Cellar/ffmpeg/4.1.4_1/lib/libavutil.dylib

现在,您的问题是系统上的 libavutil (和 ffmpeg )与Mac 10.10不向后兼容。它是针对较新的Mac 10.12构建的,该Mac 10.12似乎已对clock_gettime API进行了更改,从而导致“ 未找到符号”错误。这也已报告给opencv-python issues

  

这与OpenCV不相关。错误来自libavutil   (= FFmpeg)通过自制程序安装。错误与   二进制向后兼容性(显然,Apple已更改了   libsystem接口)。我对苹果的生态系统不太熟悉,但是   如果较早的OS版本构建FFmpeg,则可能会解决此问题   最新的OS版本中也存在较旧的符号。充分   可能无法实现macOS上的向后兼容性。

     
     

我只是被这个问题深深地困扰着   依赖FFmpeg的目标是10.12,但我的目标是10.11。希望有一个   即将发布。

     

请注意,虽然降级Xcode也可能有效,但正确的方法是   针对macOS的早期版本的目标是添加例如   -mmacosx-version-min = 10.11或-mmacosx-version-min = 10.6到CFLAGS / CXXFLAGS / LDFLAGS;这将调整头文件,编译器和链接器   生成至少与该版本的兼容的二进制文件   macOS。

唯一的解决方案似乎是安装与Mac 10.10兼容的旧版本的 ffmpeg (带有 libavutil ),然后告诉OpenCV链接到那个旧版本。您可能还需要从源代码构建OpenCV(请参见Configure and Build OpenCV to Custom FFMPEG Install)。

您也可以尝试在SuperUser上查看此帖子:
Which ffmpeg package I should download for macOS?

  • 尝试从Homebrew安装较旧的ffmpeg@2.8(尽管我不确定这是否行得通,但我没有Mac 10.10可以对其进行测试)。
  • 尝试从ffmpeg.org下载预构建的静态/共享构建。
  • 尝试从源代码构建它(请参见CompilationGuide/macOS