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 介面時保持安全:

  1. 不要用螺絲刀或金屬物品觸碰 GPIO 介面:當 Raspberry Pi 啟動時,請不要用螺絲刀或金屬物品觸碰 GPIO 介面,以避免短路或損壞。
  2. 不要超過 5V 的電壓:請不要將超過 5V 的電壓輸入到 Raspberry Pi 的 GPIO 介面,以避免損壞。
  3. 將 GND 腳位連線到裝置的 GND:在連線外部裝置時,請將 Raspberry Pi 的 GND 腳位連線到裝置的 GND,以確保安全。
  4. 不要超過 3.3V 的輸入電壓:當使用 GPIO 腳位作為輸入時,請不要超過 3.3V 的電壓,以避免損壞。
  5. 不要超過 16mA 的輸出電流:在使用 GPIO 腳位作為輸出的時候,請不要超過 16mA 的電流,並且總電流不要超過 50mA(對於舊款 26 針 Raspberry Pi)或 100mA(對於新款 40 針 Raspberry Pi)。
  6. 使用 LED 時,請使用適當的電阻:在使用 LED 時,請使用適當的電阻,以避免超過電流而損壞 LED。

遵循這些規則,您可以安全地使用 Raspberry Pi 的 GPIO 介面,並避免損壞您的裝置。

I2C 裝置的設定

如果您有 I2C 裝置想要使用於 Raspberry Pi,您需要設定 I2C 介面。以下是設定 I2C 介面的步驟:

  1. 啟用 I2C 介面:您需要啟用 Raspberry Pi 的 I2C 介面,才能使用 I2C 裝置。
  2. 安裝 I2C 相關套件:您需要安裝 I2C 相關套件,才能使用 I2C 裝置。
  3. 設定 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介面:

  1. 開啟Raspberry Pi Configuration工具(位於主選單的Preferences下)。
  2. 點選Interfaces標籤。
  3. 選擇Enabled按鈕以啟用SPI介面。
  4. 點選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 作為一個易於上手且功能豐富的開發平臺,將持續在物聯網、邊緣運算和教育領域扮演重要角色,而掌握其硬體介面和軟體工具的使用,將是開發者開啟創新應用的關鍵。