SimpleCV 提供了簡潔易用的 API 進行人臉偵測和動態偵測。人臉偵測利用 Haar 特徵辨識影像中的人臉,而動態偵測則藉由比較連續影像幀的差異來識別物體移動。本文也涵蓋了 Raspberry Pi 的 GPIO 應用,詳細說明如何設定和使用 GPIO、I2C、SPI 和序列埠等介面,並提供 Python 程式碼範例和安全使用。此外,文章還介紹瞭如何使用 i2c-tools 和 Minicom 等工具進行偵錯和測試,以及如何使用麵包板和跳線進行電子原型設計。最後,文章也簡要提及了十六進位制數字系統和光學字元識別技術。
影像處理與物體偵測
在上一節中,我們討論瞭如何使用 SimpleCV 來捕捉影像和進行基本的影像處理。現在,我們將更深入地探討如何使用 SimpleCV 來進行物體偵測,包括人臉偵測和動態偵測。
人臉偵測
SimpleCV 提供了一種簡單的方法來偵測人臉,使用 Haar 特徵。Haar 特徵是一種用於物體偵測的技術,透過分析影像中的邊緣和線條來識別物體。SimpleCV 中包含了多種預先定義的 Haar 特徵檔案,包括人臉、眼睛、鼻子、嘴巴等。
以下是使用 SimpleCV 進行人臉偵測的範例:
from SimpleCV import *
# 載入影像
img = Image("faces.jpg")
# 使用 Haar 特徵進行人臉偵測
faces = img.findHaarFeatures("face.xml")
# 將偵測到的人臉繪製在影像上
for face in faces:
img.drawRectangle(face.points[0], face.points[1], face.points[2], face.points[3])
# 顯示影像
img.show()
在這個範例中,我們使用 findHaarFeatures
方法來偵測人臉,並將偵測到的人臉繪製在影像上。
動態偵測
SimpleCV 也提供了一種簡單的方法來偵測動態,透過比較相鄰的影像框架來檢測變化。以下是使用 SimpleCV 進行動態偵測的範例:
from SimpleCV import *
# 設定最小Blob大小
MIN_BLOB_SIZE = 1000
# 建立攝像頭物件
cam = Camera()
# 取得前一張影像
old_img = cam.getImage()
while True:
# 取得新的一張影像
new_img = cam.getImage()
# 計算兩張影像之間的差異
diff = new_img - old_img
# 尋找Blob(區域)
blobs = diff.findBlobs()
# 檢查是否有Blob大於最小Blob大小
for blob in blobs:
if blob.area() > MIN_BLOB_SIZE:
print("動態偵測到!")
# 更新前一張影像
old_img = new_img
在這個範例中,我們使用 findBlobs
方法來尋找Blob(區域),並檢查是否有Blob大於最小Blob大小。如果有,我們就印出「動態偵測到!」的訊息。
內容解密:
findHaarFeatures
方法用於偵測人臉,需要提供 Haar 特徵檔案的路徑。findBlobs
方法用於尋找Blob(區域),可以根據 Blob 的大小和形狀進行篩選。Camera
類別用於建立攝像頭物件,提供了取得影像和控制攝像頭的方法。
圖表翻譯:
以下是使用 Mermaid 語法繪製的動態偵測流程圖:
flowchart TD A[取得前一張影像] --> B[取得新的一張影像] B --> C[計算兩張影像之間的差異] C --> D[尋找Blob(區域)] D --> E[檢查是否有Blob大於最小Blob大小] E --> F[印出動態偵測到!的訊息]
這個流程圖描述了動態偵測的步驟,從取得前一張影像開始,到印出動態偵測到!的訊息為止。
運動偵測技術
在本文中,我們將探討如何使用 Raspberry Pi 4 進行運動偵測。運動偵測是一種重要的應用,尤其是在安全監控和智慧家居領域。
原理
運動偵測的原理是透過比較兩個連續的影格來檢測是否有物體移動。如果兩個影格之間的差異超過了一定的閾值,則表示有運動發生。這種方法可以有效地檢測出物體的移動。
實作
以下是使用 Python 和 SimpleCV 函式庫實作運動偵測的範例:
import cv2
from simplecv import Camera, Blob
# 初始化攝像頭
cam = Camera()
# 設定最小Blob大小
MIN_BLOB_SIZE = 100
while True:
# 讀取當前影格
new_image = cam.get_image()
# 尋找Blob
blobs = new_image.find_blobs(minsize=MIN_BLOB_SIZE)
if blobs:
print("運動偵測")
# 儲存前一張影格
old_image = new_image
在這個範例中,我們使用 SimpleCV 函式庫來讀取攝像頭的影格,並使用 find_blobs
方法來尋找 Blob。如果找到 Blob,則表示有運動發生。
成功案例
以下是使用 Raspberry Pi 4 進行運動偵測的成功案例:
- 使用 Raspberry Pi 4 進行運動偵測,可以處理約 10 幀每秒的影格。
- 可以使用 Passive Infrared (PIR) 感應器來偵測運動。
光學字元識別
光學字元識別(Optical Character Recognition,OCR)是一種可以將影像中的文字轉換為可編輯文字的技術。在本文中,我們將探討如何使用 tesseract OCR 軟體來實作光學字元識別。
原理
tesseract OCR 軟體使用了一種稱為「分類別器」的演算法來識別影像中的文字。分類別器可以學習影像中的文字模式,並將其轉換為可編輯文字。
實作
以下是使用 tesseract OCR 軟體實作光學字元識別的範例:
# 安裝 tesseract OCR 軟體
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
# 下載範例影像
cd /home/pi/raspberrypi_cookbook_ed3
# 執行 tesseract OCR 軟體
tesseract ocr_test.tiff stdout
在這個範例中,我們安裝 tesseract OCR 軟體,並下載範例影像。然後,我們執行 tesseract OCR 軟體來識別影像中的文字。
成功案例
以下是使用 tesseract OCR 軟體進行光學字元識別的成功案例:
- 可以將影像中的文字轉換為可編輯文字。
- 支援多種影像格式,包括 TIFF、PDF、PNG 和 JPEG。
圖表翻譯:
graph LR A[影像] -->|tesseract OCR|> B[可編輯文字] B --> C[輸出]
在這個圖表中,我們展示瞭如何使用 tesseract OCR 軟體來將影像中的文字轉換為可編輯文字。
9.0 Raspberry Pi 的 GPIO 介紹
本章將介紹如何設定和使用 Raspberry Pi 的通用輸入/輸出(GPIO)聯結器。這個聯結器允許您將各種電子元件連線到您的 Raspberry Pi。
9.1 瞭解 GPIO 聯結器
問題:您需要將電子元件連線到 GPIO 聯結器,但首先您需要了解每個針腳的功能。
解決方案:Raspberry Pi 的 GPIO 聯結器已經有三個版本:兩個 26 針腳的佈局適用於原始的 Raspberry Pi,還有一個 40 針腳的佈局從 Raspberry Pi “+” 模型開始使用,直到現在。圖 9-1 顯示了目前的 40 針腳佈局,這適用於所有 40 針腳 GPIO Raspberry Pi 模型,從 Raspberry Pi 4 開始。
圖 9-1. GPIO 針腳組態(40 針腳模型)
在聯結器的頂部,有 3.3V 和 5V 的電源供應。GPIO 使用 3.3V 作為所有輸入和輸出的電壓。任何帶有數字的針腳都可以作為 GPIO 針腳。那些具有其他名稱的針腳也具有特殊用途:14 TXD 和 15 RXD 是序列介面的傳輸和接收針腳;2 SDA 和 3 SCL 形成 I2C 介面;10 MOSI、9 MISO 和 11 SCKL 形成 SPI 介面。
討論:如果您依靠計數下來找到所需的針腳,則在 Raspberry Pi 上確定哪個針腳是哪個可能會出現錯誤。一個更好的方法是使用像 Raspberry Leaf 一樣的 GPIO 範本,如圖 9-2 所示。 這個範本適合於 GPIO 針腳,指示哪個針腳是哪個。其他 GPIO 範本包括 Pi GPIO Reference Board。
HAT 標準是一種您可以用於 Raspberry Pi 4、3、2、B+、A+ 和 Zero 的介面標準。這個標準不會阻止您直接使用 GPIO 針腳;然而,符合 HAT 標準的介面板可以稱自己為 HAT,並且與其他介面板不同。
內容解密:
上述內容介紹了 Raspberry Pi 的 GPIO 聯結器和其功能。GPIO 聯結器允許您將電子元件連線到您的 Raspberry Pi,並提供了一種通用的輸入/輸出方式。瞭解每個針腳的功能對於正確地使用 GPIO 聯結器至關重要。
flowchart TD A[GPIO 聯結器] --> B[瞭解針腳功能] B --> C[使用 GPIO 範本] C --> D[確定針腳] D --> E[使用 GPIO]
圖表翻譯:
上述流程圖顯示了使用 Raspberry Pi 的 GPIO 聯結器的步驟。首先,您需要了解每個針腳的功能,然後使用 GPIO 範本來確定針腳。最後,您可以使用 GPIO 聯結器將電子元件連線到您的 Raspberry Pi。
Raspberry Pi 的 GPIO 介面安全使用
在使用 Raspberry Pi 的 GPIO 介面時,需要注意一些安全事項,以避免損壞您的 Raspberry Pi。以下是一些簡單的規則,幫助您在使用 GPIO 介面時保持安全:
- 不要用螺絲刀或金屬物品觸碰 GPIO 介面:當 Raspberry Pi 啟動時,請不要用螺絲刀或金屬物品觸碰 GPIO 介面,以避免短路或損壞。
- 不要超過 5V 的電壓:請不要將超過 5V 的電壓輸入到 Raspberry Pi 的 GPIO 介面,以避免損壞。
- 將 GND 腳位連線到裝置的 GND:在連線外部裝置時,請將 Raspberry Pi 的 GND 腳位連線到裝置的 GND,以確保安全。
- 不要超過 3.3V 的輸入電壓:當使用 GPIO 腳位作為輸入時,請不要超過 3.3V 的電壓,以避免損壞。
- 不要超過 16mA 的輸出電流:在使用 GPIO 腳位作為輸出的時候,請不要超過 16mA 的電流,並且總電流不要超過 50mA(對於舊款 26 針 Raspberry Pi)或 100mA(對於新款 40 針 Raspberry Pi)。
- 使用 LED 時,請使用適當的電阻:在使用 LED 時,請使用適當的電阻,以避免超過電流而損壞 LED。
遵循這些規則,您可以安全地使用 Raspberry Pi 的 GPIO 介面,並避免損壞您的裝置。
I2C 裝置的設定
如果您有 I2C 裝置想要使用於 Raspberry Pi,您需要設定 I2C 介面。以下是設定 I2C 介面的步驟:
- 啟用 I2C 介面:您需要啟用 Raspberry Pi 的 I2C 介面,才能使用 I2C 裝置。
- 安裝 I2C 相關套件:您需要安裝 I2C 相關套件,才能使用 I2C 裝置。
- 設定 I2C 裝置:您需要設定 I2C 裝置的位址和其他引數,才能正確地使用 I2C 裝置。
更多關於 I2C 裝置的設定和使用,請參考相關檔案和教程。
Mermaid 圖表:Raspberry Pi 的 GPIO 介面
flowchart TD A[GPIO 介面] --> B[安全規則] B --> C[啟用 I2C 介面] C --> D[安裝 I2C 相關套件] D --> E[設定 I2C 裝置]
圖表翻譯:
上述 Mermaid 圖表展示了 Raspberry Pi 的 GPIO 介面和 I2C 裝置的設定流程。首先,需要了解 GPIO 介面的安全規則,以避免損壞裝置。然後,需要啟用 I2C 介面和安裝相關套件。最後,需要設定 I2C 裝置的位址和其他引數,才能正確地使用 I2C 裝置。
啟用I2C介面
在最新版本的Raspbian中,啟用I2C介面非常簡單,只需使用Raspberry Pi設定工具,即可完成設定。這個工具位於主選單的偏好設定中,點選後即可看到I2C設定選項。選擇啟用I2C介面後,系統會提示您重新啟動。
使用命令列啟用I2C
如果您使用的是舊版本的Raspbian,或者您偏好使用命令列,則可以使用raspi-config
工具來啟用I2C介面。首先,開啟終端機並輸入以下命令:
$ sudo raspi-config
然後,從選單中選擇「Interfacing Options」,並滾動到「I2C」選項。選擇啟用I2C介面後,系統會提示您重新啟動。
安裝Python I2C函式庫
啟用I2C介面後,您需要安裝Python I2C函式庫,以便使用I2C裝置。輸入以下命令:
$ sudo apt-get install python-smbus
安裝完成後,重新啟動Raspberry Pi即可使用I2C介面。
使用I2C工具
如果您已經連線了I2C裝置,並且想要確認它是否已經連線成功,可以使用i2c-tools
來檢查。首先,安裝i2c-tools
:
$ sudo apt-get install i2c-tools
然後,連線I2C裝置並執行以下命令:
$ sudo i2cdetect -y 1
如果I2C介面可用,您將會看到類別似於下圖的輸出,顯示I2C地址。
內容解密:
上述命令使用i2cdetect
工具來檢查I2C介面是否可用,並顯示連線的I2C裝置的地址。 -y
選項用於停用互動式提示,1
代表I2C匯流排號碼。
十六進位制數字
十六進位制數字是一種以16為基數的數字系統,與我們平常使用的10進位制數字系統不同。十六進位制數字使用0-9和A-F來代表數字,其中A代表10,B代表11,…, F代表15。十六進位制數字通常以0x為字首,以避免與10進位制數字混淆。
圖表翻譯:
graph LR A[十進位制] -->|轉換|> B[十六進位制] B -->|0x|> C[0x68] C -->|計算|> D[104]
上述圖表顯示了十進位制數字到十六進位制數字的轉換過程。
SPI介面設定
問題描述
您想要使用Raspberry Pi的Serial Peripheral Interface(SPI)匯流排。
解決方案
由於Raspbian預設並未啟用Raspberry Pi的SPI介面,因此需要進行設定。設定步驟與Recipe 9.3大致相同。您可以透過以下步驟啟用SPI介面:
- 開啟Raspberry Pi Configuration工具(位於主選單的Preferences下)。
- 點選Interfaces標籤。
- 選擇Enabled按鈕以啟用SPI介面。
- 點選OK確認。
或者,您也可以使用命令列介面:
$ sudo raspi-config
選擇Interfacing Options,然後選擇SPI,最後選擇Yes並重新啟動您的Raspberry Pi。重新啟動後,SPI介面將可用。
討論
SPI允許Raspberry Pi與周邊裝置(如類別比數位轉換器(ADC)和埠擴充器晶片等)之間進行串列資料傳輸。您可能會遇到一些不使用SPI介面,而是使用位元碰撞(bit banging)方法的範例,這種方法使用RPi.GPIO函式庫來與SPI介面使用的四個GPIO引腳進行互動。
您可以透過以下命令檢查SPI介面是否正常工作:
$ ls /dev/*spi*
如果正常,應該會顯示 /dev/spidev0.0
和 /dev/spidev0.1
。如果沒有顯示這些內容,表示SPI介面尚未啟用。
內容解密:
以上步驟和命令都是用於啟用和檢查Raspberry Pi的SPI介面。SPI是一種重要的介面,可以讓Raspberry Pi與各種周邊裝置進行通訊。透過啟用SPI介面,您可以使用Raspberry Pi進行更多樣化的應用開發。
圖表翻譯:
flowchart TD A[啟用SPI介面] --> B[選擇Interfacing Options] B --> C[選擇SPI] C --> D[選擇Yes並重新啟動] D --> E[SPI介面可用]
此圖表描述了啟用SPI介面的步驟,從選擇Interfacing Options到重新啟動Raspberry Pi,使SPI介面可用。
使用Python進行序列埠通訊
在進行序列埠通訊時,Python提供了一個方便的函式庫叫做pyserial
,可以用來與序列埠裝置進行通訊。以下是如何使用它的範例。
安裝pyserial
首先,你需要安裝pyserial
函式庫。你可以使用pip進行安裝:
pip install pyserial
開啟序列埠連線
要開啟序列埠連線,你需要建立一個serial.Serial
物件,指定序列埠裝置和鮑率。例如:
import serial
ser = serial.Serial('/dev/ttyS0', 9600)
這裡,/dev/ttyS0
是序列埠裝置,9600
是鮑率。
傳送資料
要傳送資料,你可以使用write()
方法:
ser.write('some text')
這裡,'some text'
是你要傳送的資料。
接收資料
要接收資料,你可以使用read()
方法:
print(ser.read())
這裡,read()
方法會傳回接收到的資料。
關閉序列埠連線
當你完成序列埠通訊後,記得關閉連線:
ser.close()
使用Minicom測試序列埠
如果你想測試序列埠是否正常工作,你可以使用Minicom。Minicom是一個終端模擬器,可以用來與序列埠裝置進行通訊。
首先,你需要安裝Minicom:
sudo apt-get install minicom
然後,你可以啟動Minicom:
minicom -b 9600 -o -D /dev/ttyS0
這裡,-b 9600
指定鮑率,-D /dev/ttyS0
指定序列埠裝置。
在Minicom中,你可以按下Ctrl+A和Z鍵組合來顯示命令列表。然後,你可以按下E鍵來啟用本地回顯,這樣你就可以看到你輸入的命令。
現在,你可以與序列埠裝置進行通訊了。任何你輸入的命令都會被傳送到序列埠裝置,任何來自裝置的訊息都會被顯示出來。
圖表翻譯:
flowchart TD A[啟動Minicom] --> B[設定鮑率和序列埠裝置] B --> C[啟用本地回顯] C --> D[與序列埠裝置進行通訊] D --> E[傳送和接收資料]
內容解密:
在上面的範例中,我們使用pyserial
函式庫來與序列埠裝置進行通訊。首先,我們建立了一個serial.Serial
物件,指定序列埠裝置和鮑率。然後,我們使用write()
方法傳送資料,使用read()
方法接收資料。最後,我們關閉了序列埠連線。
在使用Minicom時,我們首先安裝了Minicom,然後啟動了Minicom,指定鮑率和序列埠裝置。然後,我們啟用了本地回顯,這樣我們就可以看到我們輸入的命令。現在,我們可以與序列埠裝置進行通訊了。
使用麵包板和跳線進行電子原型設計
問題
您想要使用 Raspberry Pi 和一個無焊接麵包板進行電子原型設計。
解決方案
使用公對母跳線和一個 GPIO 引腳標籤範本,例如 Raspberry Leaf(圖 9-9)。
圖 9-9. 使用公對母跳線將 Raspberry Pi 連線到麵包板
討論
在裸露的 Raspberry Pi 板上,識別所需的引腳並不容易。您可以透過使用像 Raspberry Leaf 這樣的 GPIO 引腳標籤範本來簡化這個過程。這個範本可以套在引腳上,幫助您快速識別所需的引腳。
另外,擁有一套公對公跳線可以幫助您在麵包板的不同部分之間建立連線。母對母跳線也很有用,可以直接將具有男性頭部引腳的模組連線到 Raspberry Pi 上,即使您不需要使用麵包板。
購買一個包含麵包板、Raspberry Leaf 和一套跳線的入門套件是獲得這些工具的好方法。例如,MonkMakes 的 Raspberry Pi 電子入門套件(見附錄 A)。
參考
我們將在配方 10.1 中詳細討論如何使用麵包板連線 LED 的範例。
從產業生態圈的動態變化來看,Raspberry Pi 在影像處理、物體偵測和硬體控制領域持續展現強大的應用潛力。本文深入探討瞭如何利用 SimpleCV 進行人臉和動態偵測,以及如何設定和使用 GPIO、I2C 和 SPI 等介面,更進一步解析了序列埠通訊和電子原型設計的實踐方法。技術堆疊的各層級協同運作中體現了軟硬體整合的價值,例如結合 SimpleCV 和攝影機模組實作動態偵測,以及利用 Python 程式函式庫操控 GPIO 控制外部裝置。然而,效能瓶頸仍是 SimpleCV 在複雜影像處理任務中的一大挑戰。雖然使用 Haar 特徵進行人臉偵測簡潔易用,但其準確性和效率仍有提升空間。未來,整合更先進的電腦視覺演算法和深度學習模型將是 SimpleCV 的重要發展方向。對於追求更高效能的應用,則可以考慮使用 OpenCV 等更為成熟的影像處理函式庫。玄貓認為,Raspberry Pi 作為一個易於上手且功能豐富的開發平臺,將持續在物聯網、邊緣運算和教育領域扮演重要角色,而掌握其硬體介面和軟體工具的使用,將是開發者開啟創新應用的關鍵。