使用 pyenv 環境安裝 opencv3|解決各種疑難雜症

Min
Becoming a data scientist
8 min readMay 18, 2019

如果你在安裝 opencv3 到 mac 時,也和我一樣遭遇以下問題,歡迎參考我搜尋整理的解決方式。

  1. 由於 python 版本管理的需求,不想要使用 homebrew 安裝的 python(因為是走整個系統的環境),而是想要使用 pyenv 管理自己的 python 版本
  2. 想要將 opencv3安裝在 virtualenvwrapper 搭建的虛擬環境中

以下的安裝步驟主要參考自 pyimagesearch: macOS: Install OpenCV 3 and Python 3.5 這篇教學,所以不會詳列所有安裝步驟,只會紀錄我遭遇的問題和解決方式

首先,Step #1 和 Step #2 都按照 pyimagesearch 的步驟走。

Step #3

由於我們想要將使用 pyenv而非 homebrew 安裝 python,因此這個步驟的更改如下。(需要先自行安裝好 pyenv,安裝教學可參考這裡

  1. 在建立 pyenv環境之前,須確保 pyenvpython開啟動態鏈結,因此需檢查環境變量 PYTHON_CONFIGURE_OPTS
$ export PYTHON_CONFIGURE_OPTS=--enable-framework # for mac
$ export PYTHON_CONFIGURE_OPTS=--enable-shared # for linux

2. 建立 pyenv 環境

$ pyenv install 3.6.6 # 安裝python 3.6.6 的版本
$ pyenv shell 3.6.6 # 指定這個shell的python版本

* 如果在這個步驟出現 zipimport.ZipImportError,很有可能是因為 Mac 版本是 Mojave 的關係,解決方式如下,具體原因請參考這裡

$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
$ pyenv install 3.6.6

繼續跟著 pyimagesearch 的 Step #4–5。

Step #6

由於我們想要安裝的是 opencv3.4.5,但是如果直接從 git clone 下載的會是最新版本 4.1.0

因此,請自行去下載想要的 opencv 版本(這裡這裡,兩個都要下載,且版本要一致),並放在 home 資料夾,並分別改名為 opencvopencv_contrib

Step #7

在這個步驟中,要尋找作者提到的以下兩個路徑,如果完全跟著我做的話,則會是 python3.6

The path to your libpython3.5.dylib file.
The path to your Python.h headers for Python 3.5.

並將搜尋之後的結果,替換至執行 cmake 指令下的 YYYZZZ

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D PYTHON3_LIBRARY=YYY \
-D PYTHON3_INCLUDE_DIR=ZZZ \
-D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=ON ..

然而,作者提到的路徑是使用 homebrew 安裝時的環境路徑,那使用 pyenv 的路徑會在哪裡呢?

很簡單,只要執行 python-config --prefix 就可以找到,將作者提到的 YYYZZZ 的開頭替換成找到的路徑,確切的檔案位置再慢慢按 tab 鍵尋找。

具體來說,當我執行 python-config --prefix,會顯示:

/Users/smhsu/.pyenv/versions/3.6.6/Python.framework/Versions/3.6

這裡就是我的檔案開頭路徑,因此我的YYYZZZ 路徑分別對應如下:

python_root = $(python-config --prefix)YYY = $(python_root)/lib/libpython3.6.dylib # python library
ZZZ = $(python_root)/include/python3.6m/ #include library

這裡請一定要自己按 tab 鍵尋找自己的檔案位置,由於安裝的 python版本不一定一樣,所以這裡的路徑也不完全會一樣。

另外,由於除了YYYZZZ 要更改以外,我嘗試非常多次不同的 cmake 指令,以下是我最終成功的版本。

$ cmake -D CMAKE_BUILD_TYPE=Release \
-D PYTHON3_INCLUDE_DIR=${python_root}/include/python3.6m \
-D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \
-D PYTHON3_LIBRARY=${python_root}/lib/libpython3.6m.dylib \
-D PYTHON3_PACKAGES_PATH=$VIRTUAL_ENV/lib/python3.6/site-packages \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_text=OFF ..

在跑完 cmake 的指令後,請務必確認圖片中的畫面,除了作者提到的 3 點:

1. The Interpreter points to the Python binary in your cv virtual environment.
2. Libraries points to your libpython3.5.dylib file.
3. The numpy version being utilized is the one you installed in your cv virtual environment.

也請存下其中的 install path,我們之後會用到。

執行完 cmake 指令後的畫面

繼續執行 Step #8。

Step #9

由於我們不是使用系統預設的 python,因此這邊找尋 .so 的路徑和作者的會有點不同。在 Step #7 中顯示的 install path 是:

~/.virtualenvs/cv/lib/python3.6/site-packages/cv2/python-3.6

所以這邊的作法是:

$ cd ~/.virtualenvs/cv/lib/python3.6/site-packages/cv2/python-3.6
$ ls -l *.so
-rwxr-xr-x 1 root admin 8043600 5 18 15:09 cv2.cpython-36m-darwin.so

在這個路徑中,我才能夠正確地找到 .so,並且更改檔名。
(注意其中的 -36m,數字有可能會和你的不同,取決於使用的版本)
改名的原因可以參見原作者的講解。

$ mv cv2.cpython-36m-darwin.so cv2.so
$ cd ~

最後,將我們安裝的 opencv3 連結到虛擬環境,這邊也要注意路徑。

$ cd ~/.virtualenvs/cv/lib/python3.6/site-packages/
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.so cv2.so
$ cd ~

最後,終於可以確認自己是否安裝成功啦。

opencv 成功安裝的畫面

--

--