電腦視覺技術已成為當今科技發展的重要趨勢,而樹莓派平臺則提供了一個低成本且易於使用的開發環境。本文將引導讀者如何在樹莓派上使用 SimpleCV 這個 Python 函式庫,進行各種電腦視覺應用。從安裝 SimpleCV 開始,逐步介紹設定 USB 攝影機與 Raspberry Pi Camera Module 的方法,並深入探討硬幣計數、邊緣檢測、圓形偵測和人臉偵測等實務案例。透過程式碼範例與圖表說明,讀者可以快速掌握 SimpleCV 的核心功能,並將其應用於自己的電腦視覺專案中。

8.0 電腦視覺簡介

電腦視覺(Computer Vision,CV)是一種讓樹莓派(Raspberry Pi)能夠「看到事物」的技術。在實際應用中,這意味著樹莓派可以分析影像,尋找感興趣的物體,甚至可以識別人臉和文字。如果你將其連線到攝像頭以供應影像,則會開啟許多可能性。

8.1 安裝 SimpleCV

問題

你想要在樹莓派上安裝 SimpleCV 電腦視覺軟體。

解決方案

要安裝 SimpleCV,首先需要安裝必要的套件。使用以下命令:

sudo apt-get update
sudo apt-get install ipython python-opencv python-scipy
sudo apt-get install python-numpy python-setuptools python-pip

然後,安裝 SimpleCV 本身:

sudo pip install svgwrite
sudo pip install --no-cache-dir SimpleCV
pip install 'IPython==4' --force-reinstall

安裝完成後,你可以透過以下命令檢查一切是否正常工作:

simplecv

這將開啟 SimpleCV 控制檯,這是一個具有額外 SimpleCV 功能的 Python 控制檯。要離開此控制檯,請輸入 exit() 命令。

SimpleCV 控制檯命令

  • exit() 或按下 Ctrl+D 離開控制檯
  • clear() 清除控制檯螢幕
  • tutorial() 啟動 SimpleCV 互動式教程
  • example() 列出可執行的示例
  • forums() 啟動網頁瀏覽器存取幫助論壇
  • walkthrough() 啟動網頁瀏覽器存取步驟教程

內容解密:

SimpleCV 是一個根據 Python 的電腦視覺平臺,提供了一個簡單易用的 API 來處理影像和視訊。它支援多種攝像頭和影像格式,並提供了許多功能來進行影像處理、物體識別和追蹤等。透過安裝 SimpleCV,你可以輕鬆地將電腦視覺功能新增到你的樹莓派專案中。

設定USB攝影機進行電腦視覺

問題描述

您想要設定USB攝影機以進行電腦視覺(CV)專案。

解決方案

使用與樹莓派(Raspberry Pi)相容的USB攝影機(請參考相容性列表)。如果您的專案需要將攝影機放在主體附近,請選擇具有手動聚焦選項的攝影機。對於需要非常接近主體的場合,低成本的USB內窺鏡可能很有用。

根據您的CV專案,您可能需要設定一個光線充足的區域。圖8-1顯示了一個簡單的光箱,由透明塑膠儲物箱製成,從側面和頂部照明以提供均勻照明。攝影機附著在箱子的頂部孔上。此安排在配方8.4中使用。

圖8-1:使用自製的“光箱”進行均勻照明 您也可以購買商用燈棚,專為攝影設計,效果很好。

您可能需要一些試驗和錯誤來使系統明亮且均勻照明。陰影可能尤其成問題。

討論

您可以從SimpleCV控制檯測試USB攝影機。啟動SimpleCV然後輸入以下命令:

SimpleCV:1> c = Camera()

如果攝影機正常工作,您應該會看到攝影機的視訊流。如果沒有,您可能需要調整攝影機的設定或驅動程式。

範例程式碼

from SimpleCV import Camera

# 建立攝影機物件
c = Camera()

# 顯示攝影機視訊流
c.live()

圖表翻譯

  graph LR
    A[設定USB攝影機] --> B[測試攝影機]
    B --> C[顯示視訊流]
    C --> D[調整設定]
    D --> E[正常工作]

圖表翻譯:

此圖表顯示設定USB攝影機的步驟。首先,設定USB攝影機,然後測試攝影機,顯示視訊流。如果視訊流不正常,則調整設定直到正常工作。

使用Raspberry Pi Camera Module進行電腦視覺

當您想要使用Raspberry Pi Camera Module與SimpleCV進行電腦視覺應用時,可能會遇到一些問題。以下是解決方案:

步驟1:安裝Raspberry Pi Camera Module

首先,您需要將Raspberry Pi Camera Module連線到您的Raspberry Pi。請確保模組已正確連線並安裝。

步驟2:安裝SimpleCV

如果您尚未安裝SimpleCV,請使用以下命令進行安裝:

sudo apt-get install simplecv

步驟3:組態SimpleCV

您需要組態SimpleCV以使用Raspberry Pi Camera Module。請使用以下命令:

sudo simplecv config

然後,選擇「Raspberry Pi Camera Module」作為攝像頭。

步驟4:測試攝像頭

現在,您可以測試攝像頭是否正常工作。請使用以下命令:

simplecv cam

如果攝像頭正常工作,您應該可以看到來自攝像頭的影片。

步驟5:使用SimpleCV進行電腦視覺

現在,您可以使用SimpleCV進行電腦視覺應用。例如,您可以使用以下命令捕捉一張圖片:

i = c.getImage()

然後,您可以顯示圖片:

i.show()

注意事項

  • 請確保Raspberry Pi Camera Module已正確連線並安裝。
  • 如果您遇到錯誤,請檢查SimpleCV是否已正確組態。
  • 如果您使用USB攝像頭,請確保它與Raspbian相容。

範例程式碼

from SimpleCV import Camera, Image

# 建立攝像頭物件
c = Camera()

# 捕捉一張圖片
i = c.getImage()

# 顯示圖片
i.show()

這個範例程式碼展示瞭如何使用SimpleCV捕捉一張圖片並顯示它。

使用SimpleCV進行硬幣計數

問題描述

您想要使用電腦視覺技術來計算攝像頭視野中的硬幣數量。

解決方案

利用SimpleCV及其findCircle函式,提供一個實時計數硬幣數量的功能。

步驟1:安裝SimpleCV和攝像頭模組

確保您已經安裝了SimpleCV和攝像頭模組。如果沒有,請參考Recipe 1.17進行安裝。

步驟2:調整照明和攝像頭位置

良好的照明和固定的攝像頭位置對於硬幣計數是非常重要的。您可以使用一個簡單的設定,如圖8-1所示。

步驟3:使用SimpleCV控制檯進行引數調整

啟動SimpleCV控制檯,捕捉一張影像,並將其顯示在一個單獨的視窗中:

SimpleCV:1> c = Camera()
SimpleCV:2> i = c.getImage()
SimpleCV:3> i.show()

這將開啟一個視窗,顯示您的硬幣影像,如圖8-2所示。

步驟4:反轉影像

圓圈檢測需要影像被反轉,或者使用黑色背景。要反轉影像並顯示它,請執行以下命令:

SimpleCV:4> i2 = i.invert()
SimpleCV:5> i2.show()

這將建立一個反轉的影像副本,如圖8-3所示。

步驟5:使用findCircle函式進行圓圈檢測

現在您的影像已經準備好了,下一步是使用findCircle命令讓SimpleCV搜尋圓圈。這個命令需要三個引數,您需要調整它們以防止誤識別:

SimpleCV:6> circles = i.findCircle()

您需要根據您的硬幣影像調整這些引數,以獲得最佳的結果。

步驟6:編寫Python程式進行硬幣計數

一旦您調整好了引數,您就可以編寫一個Python程式來計算硬幣數量。以下是一個簡單的示例:

from SimpleCV import Camera, Image

# 建立攝像頭物件
cam = Camera()

# 捕捉一張影像
img = cam.getImage()

# 反轉影像
img_inv = img.invert()

# 使用findCircle函式進行圓圈檢測
circles = img_inv.findCircle()

# 計算硬幣數量
coin_count = len(circles)

# 顯示結果
print("硬幣數量:", coin_count)

這個程式將捕捉一張影像,反轉它,然後使用findCircle函式進行圓圈檢測。最後,它將計算硬幣數量並顯示結果。

影像邊緣檢測與圓形偵測

在電腦視覺(CV)中,邊緣檢測是一個重要的步驟,用於識別影像中的物體。邊緣是指影像中畫素顏色發生明顯變化的位置。在本文中,我們將探討如何使用SimpleCV函式庫進行邊緣檢測和圓形偵測。

邊緣檢測引數

SimpleCV函式庫中的findCircle方法需要三個引數:cannythreshdistance

  • canny:此引數用於設定邊緣檢測的閾值。降低此值將導致更多邊緣被檢測出來,但是這可能不會導致更多圓形被偵測到,因為額外的邊緣可能會干擾圓形的形狀。
  • thresh:此引數用於設定圓形偵測的閾值。降低此值將導致更多圓形被偵測到。
  • distance:此引數用於設定相鄰圓形之間的最小距離(以畫素為單位)。

圓形偵測

使用以下命令進行圓形偵測:

coins = i2.findCircle(canny=100, thresh=70, distance=15)

這將傳回一個包含偵測到的圓形的列表。

顯示偵測結果

可以使用以下命令顯示偵測結果:

coins.draw(width=4)
coins.show()

這將顯示超級於實際硬幣上的圓形。

自動化偵測

可以將上述命令封裝在一個Python程式中,以實作自動化偵測。以下是示例程式碼:

from SimpleCV import *

c = Camera()
while True:
    i = c.getImage().invert()
    coins = i.findCircle(canny=100, thresh=70, distance=1)
    print(len(coins))

這個程式將不斷地捕捉影像,進行邊緣檢測和圓形偵測,並列印預出偵測到的圓形數量。

圖表翻譯:

  flowchart TD
    A[影像捕捉] --> B[邊緣檢測]
    B --> C[圓形偵測]
    C --> D[顯示結果]
    D --> E[自動化偵測]

內容解密:

上述程式使用SimpleCV函式庫進行影像處理和分析。首先,捕捉影像並進行邊緣檢測,然後使用findCircle方法進行圓形偵測。最後,顯示偵測結果並列印預出偵測到的圓形數量。

人臉偵測技術

人臉偵測是一種利用電腦視覺技術來識別影像或影片中人臉的位置和大小的方法。這種技術在安全監控、人臉識別、表情分析等領域有著廣泛的應用。

根據HAAR特徵的人臉偵測

HAAR特徵是一種根據影像的特徵提取方法,最初用於高空攝影的物體偵測。後來,這種方法被應用於人臉偵測領域,取得了良好的效果。SimpleCV是一種根據Python的電腦視覺函式庫,它提供了HAAR特徵的人臉偵測功能。

安裝SimpleCV

要使用SimpleCV的人臉偵測功能,首先需要安裝SimpleCV函式庫。可以透過pip命令進行安裝:

pip install simplecv

載入影像和偵測人臉

載入含有人臉的影像,可以使用以下程式碼:

from simplecv import Image

# 載入影像
img = Image("faces.jpg")

#偵測人臉
faces = img.findHaarFeatures('face.xml', min_neighbors=5)

其中,faces.jpg是含有人臉的影像檔案,face.xml是HAAR特徵的人臉偵測模型檔案。

繪製人臉矩形

偵測到人臉後,可以使用以下程式碼繪製人臉矩形:

# 繪製人臉矩形
faces.draw(width=4)

# 顯示影像
img.show()

這將會顯示出含有人臉矩形的影像。

Mermaid 圖表

  graph LR
    A[載入影像] --> B[偵測人臉]
    B --> C[繪製人臉矩形]
    C --> D[顯示影像]

圖表翻譯

上述Mermaid圖表描述了人臉偵測的流程。首先,載入含有人臉的影像。然後,使用HAAR特徵的人臉偵測模型偵測人臉。偵測到人臉後,繪製人臉矩形。最後,顯示出含有人臉矩形的影像。

程式碼解釋

上述程式碼使用SimpleCV函式庫來實作人臉偵測功能。首先,載入含有人臉的影像。然後,使用findHaarFeatures方法偵測人臉。偵測到人臉後,使用draw方法繪製人臉矩形。最後,使用show方法顯示出含有人臉矩形的影像。

內容解密

上述程式碼的每一行都有其特定的作用。首先,from simplecv import Image匯入了SimpleCV函式庫的Image類別。然後,img = Image("faces.jpg")載入了含有人臉的影像。接下來,faces = img.findHaarFeatures('face.xml', min_neighbors=5)使用HAAR特徵的人臉偵測模型偵測人臉。偵測到人臉後,faces.draw(width=4)繪製了人臉矩形。最後,img.show()顯示出了含有人臉矩形的影像。

人臉偵測技術在未來將會有更廣泛的應用。例如,可以使用深度學習技術來提高人臉偵測的準確度。另外,可以將人臉偵測技術與其他電腦視覺技術結合,實作更複雜的功能。例如,可以使用人臉偵測技術來識別人臉,並使用表情分析技術來分析人臉的情緒。

從使用者經驗視角來看,SimpleCV 降低了電腦視覺應用的門檻,讓即使是樹莓派使用者也能輕鬆上手。本文涵蓋了從安裝 SimpleCV、設定攝影機、進行硬幣計數和人臉偵測等一系列實務操作,展現了其在影像處理領域的廣泛應用性。然而,SimpleCV 的功能仍有其限制,例如在硬幣計數和圓形偵測中,需要仔細調整引數才能獲得理想結果,這對初學者來說可能是一個挑戰。此外,文章雖然提到了 HAAR 特徵的人臉偵測,但並未深入探討其他更先進的人臉偵測技術,例如根據深度學習的方法。展望未來,隨著電腦視覺技術的快速發展,預期 SimpleCV 也將持續更新迭代,整合更多先進的演算法和功能,例如更精確的物體偵測、影像分割和場景理解等,以滿足更多元的應用需求。對於想要入門電腦視覺的使用者,建議先從 SimpleCV 的基礎功能入手,逐步探索其在不同場景下的應用,並持續關注相關技術的發展趨勢。玄貓認為,SimpleCV 作為一個易於使用的電腦視覺工具,對於教育和原型開發具有相當價值,但對於複雜的商業應用,仍需評估其效能和可擴充套件性。