由於目前很多原生 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 勇哥
若覺得此文真對您有幫助, 點點左上方的拍手圖示, 鼓勵一下。若還想 請喝杯咖啡 鼓勵一下勇哥的繼續創作, 也感謝 😘 😘 !!