【问题标题】:Why do I get an ImportError for opencv2 when I run on python3.7.3?为什么我在 python3.7.3 上运行时会收到 opencv2 的 ImportError?
【发布时间】:2019-11-25 21:57:52
【问题描述】:

我正在尝试在 Mac OS 10.10 上使用 python3.7.3 导入 o​​pencv2,但出现 ImportError。我该如何解决?

我尝试使用 pip、pip3 和自制软件安装 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

【问题讨论】:

  • 你能给我看完整的错误日志吗?
  • 这就是我在 python 上的全部内容。它说语法错误:终端上的语法无效。
  • 你安装了哪个版本的 OpenCV 和 opencv-python?
  • 我试过opencv 2.4.13.6和3.4.6,python是3.7.3

标签: python-3.x macos opencv


【解决方案1】:

这个问题似乎(奇怪地)与您的 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 构建的,它似乎引入了对 clock_gettime API 的更改,导致“Symbol not found”错误。这也已报告给opencv-python issues

这与 OpenCV 无关。错误来自 libavutil (=FFmpeg) 通过自制软件安装。该错误与 二进制向后兼容性(显然 Apple 已更改 库系统接口)。我对苹果的生态系统不太熟悉,但 针对早期操作​​系统版本构建 FFmpeg 可能会解决问题,如果 较旧的符号也出现在最新的操作系统版本中。满的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2017-10-20
    • 2012-05-31
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多