在python中导入opencv时出错

时间:2013-03-28 20:18:26

标签: python opencv

我在mac上使用这些命令安装了opencv:

$ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2
$ tar xjvf OpenCV-2.4.3.tar.bz2
$ cd OpenCV-2.4.3
$ mkdir build; cd build
$ cmake -G "Unix Makefiles" -D CMAKE_OSX_ARCHITECTURES=i386 -D CMAKE_C_FLAGS=-m32 -D CMAKE_CXX_FLAGS=-m32 ..
$ make -j4
$ sudo make install

然后我尝试通过导入它来使用它,但得到以下错误:

~/opencv-2.4.4/build $ python
Python 2.7.3 (default, Mar 28 2013, 14:31:14) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/cv.py", line 3, in <module>
    from cv2.cv import *
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/cv2.so, 2): no suitable image found.  Did find:
    /usr/local/lib/python2.7/site-packages/cv2.so: mach-o, but wrong architecture

更新

在编译OpenCV时,我注意到它从以前的版本中获取了python库(由apple安装了一个):

-- Could NOT find PythonLibs: Found unsuitable version "2.7.2", but required is exact version "2.7.3" (found /usr/lib/libpython2.7.dylib)

--   Python:
--     Interpreter:                 /usr/local/bin/python2 (ver 2.7.3)
--     Libraries:                   /usr/lib/libpython2.7.dylib (ver 2.7.2)
--     numpy:                       /usr/local/lib/python2.7/site-packages/numpy/core/include (ver 1.7.0)
--     packages path:               lib/python2.7/site-packages

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

错误告诉您问题是“mach-o,但架构错误”。这通常意味着您尝试在64位应用程序中加载32位库,反之亦然(或类似地,对于英特尔与PowerPC)。

无论你安装了哪种Python,你都可能拥有一个可以作为32位应用程序或64位应用程序运行的通用构建,但默认情况下它运行为64位。但是你明确地为32位构建OpenCV:

$ cmake -G "Unix Makefiles" -D CMAKE_OSX_ARCHITECTURES=i386 -D CMAKE_C_FLAGS=-m32 -D CMAKE_CXX_FLAGS=-m32 ..

如果这是一个错误,只需重建,不要那样做。

如果你想要它是32位,你可以在32位模式下启动Universal python,或者安装一个32位的Python。


与此同时,你正试图用Homebrew安装的Python 2.7.3来运行它,但你很有可能在Apple预安装的2.7.2上构建它(或者更糟糕的是,部分构建它方式,另一方面)。

首先,人们将Homebrew添加到PATH的常用方式不会影响使用sudo运行的任何命令,因此如果sudo make install做任何事情来找到你的Python,它可能会发现不同于cmakemake做了。

其次,Apple的Python和Homebrew认为他们拥有/usr/local/lib/python2.7(并且还认为他们拥有安装/usr/local/bin/pip-2.7等工具/脚本的专有权,这使得这更加痛苦。

答案 1 :(得分:0)

根据我的经验,(来自debian的arm-linux-gcc(uclibc)交叉编译),

Python试图用dlopen(/usr/lib/python2.7/site-packages/cv2.so)加载正确的文件,但是我得到了#34;找不到文件&#34;而文件存在。

在我的董事会上:

$ python
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: File not found

实际上,动态负载试图加载递归依赖库(当然)。但是,就我而言,libstdc ++没有嵌入我的主板,而opencv需要它:

主持人:

$ arm-linux-readelf -d ./lib/cv2.so 
Dynamic section at offset 0x24197c contains 23 entries:
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libpython2.7.so.1.0]
0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.0]*

我希望它可以提供帮助。