在ARM 版本的 Mac M1 上安裝 OpenCV (進階指定路徑)

Yungger
11 min readMay 19, 2021

由於目前很多原生 Python 套件都還無法相容於 M1 上, OpenCV 就是其中之一, 所以在安裝的過程或執行上都會出現各式錯誤。例如直接使用 pip3 安裝 opencv, numpy 和 matplotlib 等套件,都會出現如 pep517的 錯誤,導致套件安裝失敗。,所以我們必須透過其他的方式, 重新編譯後安裝才能正常被 import。

STEP 1 : 安裝 Xcode

至 App Store 中搜尋 “Xcode”, 找到後直接點選安裝。

安裝完畢後, 打開終端機, 輸入

% sudo xcodebuild -license

出現錯誤訊息 ”xcode-select: error: tool ‘xcodebuild’ requires Xcode, but active developer directory ‘/Library/Developer/CommandLineTools’ is a command line tools instance”

修改開發者工具的路徑至

% sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

閱讀授權文件, 一直按 space 鍵至最後一頁, 提示輸入 “agree” 後即完成。

執行並輸入同意 Xcode license, 並輸入以下指令, 接下來是安裝 Apple 命令列工具 (若已安裝過則可略)。

使用命令列

% sudo xcode-select — install

或至 Apple 開發者官網, 登入帳號後, 下載最新版的 Command Line Tools

STEP 2: 安裝 Homebrew

Homebrew 是一款套件管理工具,目前支持 macOS 和 linux 系统。主要有四個部分组成: brew、homebrew-core 、homebrew-cask、homebrew-bottles。

***官方說明,新的 M1 ARM CPU 版本 Homebrew 必須安裝在 /opt/homebrew 路徑下,而非之前的 /usr/local/homebrew。***

下載 ARM 版 Homebrew

% cd /opt # 切换到 /opt 目录
% mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

加入路徑的環境變數 Homebrew

在終端機下, 輸入

% nano ~/.zshrc

在檔案內容的最下面, 加入此環境變數 PATH

export PATH=$PATH:/opt/homebrew/bin

存檔離開後, 在終端機下輸入下面指令, 讓環境變數能即刻生效。

% source ~/.zshrc

在終端機 App 貼上下面兩列指令字串

% echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/vincent/.zprofile
% eval $(/opt/homebrew/bin/brew shellenv)

檢視 Homebrew 的版本

% which -a brew
% brew -v

檢視 Homebrew 的環境設定

% brew config

檢查一下, 是否已正常安裝且可執行

% brew help

STEP 3 : 安裝 Conda (Python 3環境)

% brew install miniforge

訊息顯示 conda 指令的執行連結路徑將為 /opt/homebrew/bin/conda, 接下來, 輸入以下指令初始化 Shell。

% conda init zsh

預設每當終端機一被開啟, 預設 Conda 就會進入 base 的基礎工作環境下, 若要讓開機時不自動載入時, 可輸入以下指令

conda config --set auto_activate_base false

依指示重啟 Terminal 後, 會自動進入 Conda 預設建立的基礎環境 base。

***若需要移除 miniforge 時 ***

% brew install miniforge

STEP 4: 新增虛擬環境專案

新增一個虛擬環境專案

假設我想新增一個專案名為 my_cvzone 的虛擬環境, 並指定安裝至路徑 ~/Projects/Conda/envs/my_cvzone 的目錄下

(base) % conda create -p ~/Projects/Conda/envs/my_cvzone

*** 或若不指定路徑時, 則參數為 -n, 預設的安裝路徑目錄將會是在 /opt/homebrew/Caskroom/miniforge/base/envs/my_cvzone/

(base) % conda create -n my_cvzone

啟動 (進入) 虛擬環境

(base) % conda activate ~/Projects/Conda/envs/my_cvzone

(base) % conda activate my_cvzone # 未指定路徑時所建置的虛擬環境

***其他常用的 Conda 指令, 可參考文章末的補充章節***

STEP 5: 安裝指定版本的 Python

conda search python 得知套件清單中最新版 3.9.4

(my_cvzone) % conda search python
(my_cvzone) % conda install -y python==3.9.4

檢查環境中安裝的 Python 版本與所在路徑

(my_cvzone) % python -V
(my_cvzone) % which python3
(my_cvzone) % which python2

由上可知, my_cvzone 的虛擬環境使用的 Python 已是指定路徑的 ~/Projects/Conda/envs/my_cvzone/bin/python3 (此路徑後面編譯 OpenCV 時會用到)

STEP 6: 安裝 Numpy

在終端機, 輸入 search 來查看是否已有 numpy, 找到後用 install 指令安裝

(my_cvzone) % conda search numpy
(my_cvzone) % conda install -y numpy

以 Python 語法檢查, 取得了 Numpy 版本為 1.20.2, 表示已可正常被 import。

(my_cvzone) % python
>>> import numpy
>>> numpy.version.version
>>> quit()

STEP 7: 編譯 OpenCV

下載目前最新版本

假設目前的最新版本為 4.5.2, 下載路徑至 ~/Projects/Conda/ 目錄下

% cd ~/Projects/Conda/
% curl -L -o opencv.zip https://github.com/opencv/opencv/archive/4.5.2.zip
% curl -L -o opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.2.zip

檢查是否 OpenCV 的壓縮檔是否已被下載 ?

(my_cvzone) % ls -alh *.zip

解壓縮 opencv.zip 與 opencv_contrib.zip

(my_cvzone) % unzip opencv.zip
(my_cvzone) % unzip opencv_contrib.zip

解壓縮後會自動產生 opencv-4.5.2 與 opencv_contrib-4.5.2 目錄, 原下載的 *.zip 檔便可刪除

產生 OpenCV 編譯檔

在 opencv-4.5.2 目錄下建一個 build 的子目錄

(my_cvzone) % cd opencv-4.5.2
(my_cvzone) % mkdir build && cd build

視需要修改內容, 並特別須確認 CMAKE_INSTALL_PREFIX, OPENCV_EXTRA_MODULES_PATH 與 PYTHON3_EXECUTABLE 是否無誤後, 再將下面的指令貼到 build 目錄下的命令列執行

(my_cvzone) % cmake \
-DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DWITH_OPENJPEG=OFF \
-DWITH_IPP=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/Projects/Conda/opencv_contrib-4.5.2/modules \
-D PYTHON3_EXECUTABLE=~/Projects/Conda/envs/my_cvzone/bin/python3 \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_EXAMPLES=ON ..

成功的最後畫面如下

接下來, 輸入 make -j8 後, 此步驟會花一點, 須耐心等待執行至完畢

(my_cvzone) % make -j8

編譯完成後, 就可以開始安裝 OpenCV 了

(my_cvzone) % sudo make install

STEP 8: 安裝 OpenCV

建立 OpenCV 的 Sym-link 檔案連結

首先, 我們必須先知道編譯過程中所產生的 .so 的所在路徑, 才能建立 OpenCV 4 在 macOS 的 Sym-link 檔案連結。

(my_cvzone) % mdfind cv2.cpython

切換至虛擬環境下的 site-packages 目錄, 建立 OpenCV 的 Sym-link 檔案連結

(my_cvzone) % cd ~/Projects/Conda/envs/my_cvzone/lib/python3.9/site-packages 
(my_opencv) % ln -s /usr/local/lib/python3.9/site-packages/cv2/python-3.9/cv2.cpython-39-darwin.so cv2.so

確認 OpenCV 是否已安裝妥當, 並檢查所裝的版本?

(my_opencv) % python 
>>> import cv2
>>> cv2.__version__

*** 恭喜 !! 總算能撥雲見日, OpenCV 也能被 import 使用了。***

牛刀小試一下:彩色圖轉成鉛筆素描

原圖

作者:Yungger 勇哥

若覺得此文真對您有幫助, 點點左上方的拍手圖示, 鼓勵一下。若還想 請喝杯咖啡 鼓勵一下勇哥的繼續創作, 也感謝 😘 😘 !!

--

--