7.1 KiB
捕捉影像 - Raspberry Pi
在本課程中,您將為 Raspberry Pi 添加一個相機感測器,並從中讀取影像。
硬體
Raspberry Pi 需要一個相機。
您將使用的相機是 Raspberry Pi Camera Module。這款相機專為 Raspberry Pi 設計,通過 Pi 上的專用連接器連接。
💁 這款相機使用 Camera Serial Interface,一種由移動產業處理器接口聯盟制定的協議,簡稱 MIPI-CSI。這是一種專用的影像傳輸協議。
連接相機
相機可以通過一條扁平排線連接到 Raspberry Pi。
任務 - 連接相機
-
關閉 Raspberry Pi 的電源。
-
將隨相機附帶的扁平排線連接到相機上。為此,輕輕拉動插座上的黑色塑料夾,使其稍微彈出,然後將排線滑入插座,藍色面朝遠離鏡頭的一側,金屬針腳條紋面朝鏡頭的一側。插到底後,將黑色塑料夾推回原位。
您可以在 Raspberry Pi 相機模組入門文檔 中找到一個動畫,展示如何打開夾子並插入排線。
-
從 Raspberry Pi 上取下 Grove Base Hat。
-
將扁平排線穿過 Grove Base Hat 上的相機槽。確保排線的藍色面朝向標有 A0、A1 等的類比端口。
-
將扁平排線插入 Raspberry Pi 上的相機端口。同樣,拉起黑色塑料夾,插入排線,然後將夾子推回原位。排線的藍色面應朝向 USB 和以太網端口。
-
重新安裝 Grove Base Hat。
編程相機
現在可以使用 PiCamera Python 庫來編程 Raspberry Pi 以使用相機。
任務 - 啟用舊版相機模式
隨著 Raspberry Pi OS Bullseye 的發布,操作系統中內置的相機軟體發生了變化,導致 PiCamera 默認無法使用。目前正在開發一個替代方案,名為 PiCamera2,但尚未準備好使用。
目前,您可以將 Raspberry Pi 設置為舊版相機模式,以使 PiCamera 正常工作。相機插座默認也是禁用的,但啟用舊版相機軟體會自動啟用插座。
-
啟動 Raspberry Pi,等待其完成啟動。
-
啟動 VS Code,可以直接在 Raspberry Pi 上操作,或者通過 Remote SSH 擴展連接。
-
在終端中執行以下命令:
sudo raspi-config nonint do_legacy 0 sudo reboot
這將切換設置以啟用舊版相機軟體,然後重新啟動 Raspberry Pi 以使設置生效。
-
等待 Raspberry Pi 重新啟動,然後重新啟動 VS Code。
任務 - 編程相機
編程設備。
-
在終端中,於
pi
用戶的主目錄中創建一個名為fruit-quality-detector
的新資料夾。在此資料夾中創建一個名為app.py
的檔案。 -
在 VS Code 中打開此資料夾。
-
要與相機互動,可以使用 PiCamera Python 庫。使用以下命令安裝該 Pip 套件:
pip3 install picamera
-
將以下代碼添加到您的
app.py
檔案中:import io import time from picamera import PiCamera
此代碼導入了一些所需的庫,包括
PiCamera
庫。 -
在此代碼下方添加以下代碼以初始化相機:
camera = PiCamera() camera.resolution = (640, 480) camera.rotation = 0 time.sleep(2)
此代碼創建了一個 PiCamera 對象,並將解析度設置為 640x480。雖然支持更高的解析度(最高可達 3280x2464),但影像分類器處理的影像尺寸要小得多(227x227),因此無需捕捉和傳輸更大的影像。
camera.rotation = 0
行設置影像的旋轉角度。扁平排線從相機底部進入,但如果您的相機為了更方便地對準要分類的物品而旋轉了,則可以將此行更改為相應的旋轉角度。例如,如果您將扁平排線懸掛在相機上方,則將旋轉角度設置為 180:
camera.rotation = 180
相機啟動需要幾秒鐘,因此需要
time.sleep(2)
。 -
在此代碼下方添加以下代碼以將影像捕捉為二進位數據:
image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)
此代碼創建了一個
BytesIO
對象來存儲二進位數據。影像以 JPEG 文件的形式從相機讀取並存儲在此對象中。該對象有一個位置指示器,用於指示當前數據的位置,因此image.seek(0)
行將位置移回起始點,以便稍後可以讀取所有數據。 -
在此代碼下方添加以下代碼以將影像保存到文件:
with open('image.jpg', 'wb') as image_file: image_file.write(image.read())
此代碼打開一個名為
image.jpg
的文件進行寫入,然後從BytesIO
對象中讀取所有數據並寫入該文件。💁 您可以直接將影像捕捉到文件,而不是使用
BytesIO
對象,只需將文件名傳遞給camera.capture
調用即可。使用BytesIO
對象的原因是,在本課程的後續部分,您可以將影像發送到影像分類器。 -
將相機對準某個物體並運行此代碼。
-
一張影像將被捕捉並保存為當前資料夾中的
image.jpg
文件。您可以在 VS Code 的檔案瀏覽器中看到此文件。選擇該文件以查看影像。如果需要旋轉,請根據需要更新camera.rotation = 0
行,然後重新拍攝。
💁 您可以在 code-camera/pi 資料夾中找到此代碼。
😀 您的相機程式成功了!
免責聲明:
本文件已使用 AI 翻譯服務 Co-op Translator 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。