[樹莓派] OpenCV 圖片操作

本篇主要介紹使用樹莓派操作 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()
原圖
灰階
bgr圖片

資訊

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軸翻轉
垂直+水平翻轉
沿著x軸(垂直)翻轉
沿著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 本站之機器以及親自操作之畫面截圖。

讓我知道你在想什麼!

Picture of ALEX

ALEX

藍白拖愛好者,一事無成話偏多

Recent Posts

C++

NLP