本篇主要介紹使用樹莓派操作 OpenCV。
OpenCV 是一個跨平台的電腦視覺庫,目前 OpenCV 已經內建非常多的功能模組,未來要進行電腦視覺辨識也會用到這個函式庫。這也算是我第一次使用這個視覺庫,未來要好好利用體會一下它的強大之處。
需要物品
已經設定好圖形介面、Python 虛擬環境的樹莓派。
大致上流程如下:
1. 安裝相關套件
2. 設定 Tonny
3. 操作 OpenCV
安裝相關套件
首先每次安裝新的東西前記得都先更新或升級作業系統:$ sudo apt-get update
(更新)$ sudo apt-get upgrade
(升級)
緊接著我們會安裝 JPEG-2000 圖片函式庫、 QT 圖形介面套件和 HDF5 資料集的套件。
$ sudo apt-get install -y libatlas-base-dev
$ sudo apt-get install -y libjasper-dev
$ sudo apt-get install -y libqtgui4
$ sudo apt-get install -y libqt4-test
$ sudo apt-get install -y python3-pyqt5
$ sudo apt-get install -y libhdf5-dev
以下指令將會在名字叫做 env_opencv
的虛擬環境中進行操作,若有取別的名字複製指令的時候記得替換。
接著我們需要安裝一些必要的套件以及 OpenCV 本人。
$ workon env_opencv
(切換環境)(env_opencv) pi@raspberrypi:~ $ pip install numpy
(env_opencv) pi@raspberrypi:~ $ pip install matplotlib
(env_opencv) pi@raspberrypi:~ $ pip install imutils
(env_opencv) pi@raspberrypi:~ $ pip install opencv-python
上面安裝過程可能會比較久一點,就耐心等待吧!
有茶包!
很討厭建置環境就是因為這一點,總是能毫不意外地噴錯,這次是安裝 numpy 時遇到的情況(僅擷取最後幾行資訊):
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for numpy
Failed to build numpy
ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
爬文之後理解到有可能是版本衝突問題。
我的 Python 版本是 3.7,直接用 pip install numpy
版本會抓 1.21.6,但因為我找不到相關文件對照我的 Python 版本,所以也是爬看有沒有人遇到和我相同問題,把版本下降,最後嘗試這一版就成功了: pip install numpy==1.20.0
設定 Tonny 執行環境
Tonny 是專門為 Python 初學者打造的IDE,有許多作業系統版本,更重要的是,它同時也是樹莓派作業系統內建的 Python 程式開發工具,不需要裝一些有的沒的,相當方便。
我們需要先設定 Tonny 使用 env_opencv
這個虛擬環境。首先進入到路徑 Tools/Options...
,並選擇頁籤 Interpreter
,把選項的設置改為如下圖:
意思是要選擇其他的直譯器或虛擬環境,以本篇的例子當然就是要選擇我們剛剛建置好的環境。下方欄位點選 ...
按鈕後,找到路徑:/home/pi/.virtualenvs/env_opencv/bin/python3
,如果在 pi
資料夾底下找不到,在 pi
資料夾按右鍵選擇顯示隱藏資料夾即可。
選擇好路徑後,下方直譯器的路徑也會改變,順便測試能不能看到 OpenCV 的安裝版本:>>> import cv2
>>> cv2.__version__
讚喔,目前為止一切順利。
OpenCV 基本操作
讀取圖片
程式碼蠻簡單的,就不多提:
import cv2 img = cv2.imread("/home/pi/Downloads/Dachshund.jpeg") cv2.imshow("Dachshund", img) cv2.waitKey(0) cv2.destroyAllWindows()
比較特別的是 imshow
後方記得加上 waitKey(0)
,才不會讓圖片一閃即逝比流星還快又不能許願。0 可以改成 1000 體會一下視窗出現一秒又被關閉的感覺。
有彩色讀取當然有灰階讀取:
import cv2 img_gray = cv2.imread("/home/pi/Downloads/Dachshund.jpeg", cv2.IMREAD_GRAYSCALE) cv2.imshow("Dachshund_gray", img_gray) cv2.waitKey(0) cv2.destroyAllWindows()
另外可以觀察一下 img
本身所存的資訊是矩陣:
所以其實內部都是使用矩陣做圖片運算。
色彩轉換
另外若是同一張圖片載入後進行顏色變換(而不是讀取時變換),則可以使用以下方法:
import cv2 img = cv2.imread("/home/pi/Downloads/Dachshund.jpeg") img_to_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #轉換成灰階 img_to_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) #轉換成BGR圖片 cv2.imshow("Dachshund", img) cv2.imshow("Dachshund_gray", img_to_gray) cv2.imshow("Dachshund_bgr", img_to_bgr) cv2.waitKey(0) cv2.destroyAllWindows()
資訊
import cv2 img = cv2.imread("/home/pi/Downloads/Dachshund.jpeg") h, w, c = img.shape print("高:", h) print("寬:", w) print("色彩數:", c)
output:高:625
寬:863
色彩數:3
接下來幾個操作都要記得先匯入 imutils
:import imutils
改變尺寸
使用此方法調整尺寸,只需要調整一邊大小,就可以維持長寬比調整尺寸:
import imutils img = cv2.imread("/home/pi/Downloads/Dachshund.jpeg") img_resized = imutils.resize(img, width=300)
cv2.resize()
其實也可以。
旋轉
import imutils img = cv2.imread("/home/pi/Downloads/Dachshund.jpeg") img_rotated = imutils.rotate(img, angle=90) img_flip1 = cv2.flip(img, -1) #小於0是水平、垂直翻轉 img_flip2 = cv2.flip(img, 0) #等於0是沿x軸翻轉 img_flip3 = cv2.flip(img, 1) #大於0是沿y軸翻轉
剪裁
先前有提過圖片其實是矩陣資料,所以裁切就是截取矩陣某部分。
import cv2 img = cv2.imread("/home/pi/Downloads/Dachshund.jpeg") img_crop = img[150:400, 200:380]
文章圖片:
臘腸狗圖片取自 https://www.petmd.com/dog/breeds/c_dg_dachshund
其餘圖片皆是 Alex’s Spot 本站之機器以及親自操作之畫面截圖。