You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/mo/4-manufacturing/lessons/2-check-fruit-from-device/pi-camera.md

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 相機

  1. 關閉 Raspberry Pi 的電源。

  2. 將隨相機附帶的扁平排線連接到相機上。為此,輕輕拉動插座上的黑色塑料夾,使其稍微彈出,然後將排線滑入插座,藍色面朝遠離鏡頭的一側,金屬針腳條紋面朝鏡頭的一側。插到底後,將黑色塑料夾推回原位。

    您可以在 Raspberry Pi 相機模組入門文檔 中找到一個動畫,展示如何打開夾子並插入排線。

    扁平排線插入相機模組

  3. 從 Raspberry Pi 上取下 Grove Base Hat。

  4. 將扁平排線穿過 Grove Base Hat 上的相機槽。確保排線的藍色面朝向標有 A0A1 等的類比端口。

    扁平排線穿過 Grove Base Hat

  5. 將扁平排線插入 Raspberry Pi 上的相機端口。同樣,拉起黑色塑料夾,插入排線,然後將夾子推回原位。排線的藍色面應朝向 USB 和以太網端口。

    扁平排線連接到 Raspberry Pi 的相機插座

  6. 重新安裝 Grove Base Hat。

編程相機

現在可以使用 PiCamera Python 庫來編程 Raspberry Pi 以使用相機。

任務 - 啟用舊版相機模式

隨著 Raspberry Pi OS Bullseye 的發布,操作系統中內置的相機軟體發生了變化,導致 PiCamera 默認無法使用。目前正在開發一個替代方案,名為 PiCamera2但尚未準備好使用。

目前,您可以將 Raspberry Pi 設置為舊版相機模式,以使 PiCamera 正常工作。相機插座默認也是禁用的,但啟用舊版相機軟體會自動啟用插座。

  1. 啟動 Raspberry Pi等待其完成啟動。

  2. 啟動 VS Code可以直接在 Raspberry Pi 上操作,或者通過 Remote SSH 擴展連接。

  3. 在終端中執行以下命令:

    sudo raspi-config nonint do_legacy 0
    sudo reboot
    

    這將切換設置以啟用舊版相機軟體,然後重新啟動 Raspberry Pi 以使設置生效。

  4. 等待 Raspberry Pi 重新啟動,然後重新啟動 VS Code。

任務 - 編程相機

編程設備。

  1. 在終端中,於 pi 用戶的主目錄中創建一個名為 fruit-quality-detector 的新資料夾。在此資料夾中創建一個名為 app.py 的檔案。

  2. 在 VS Code 中打開此資料夾。

  3. 要與相機互動,可以使用 PiCamera Python 庫。使用以下命令安裝該 Pip 套件:

    pip3 install picamera
    
  4. 將以下代碼添加到您的 app.py 檔案中:

    import io
    import time
    from picamera import PiCamera
    

    此代碼導入了一些所需的庫,包括 PiCamera 庫。

  5. 在此代碼下方添加以下代碼以初始化相機:

    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)

  6. 在此代碼下方添加以下代碼以將影像捕捉為二進位數據:

    image = io.BytesIO()
    camera.capture(image, 'jpeg')
    image.seek(0)
    

    此代碼創建了一個 BytesIO 對象來存儲二進位數據。影像以 JPEG 文件的形式從相機讀取並存儲在此對象中。該對象有一個位置指示器,用於指示當前數據的位置,因此 image.seek(0) 行將位置移回起始點,以便稍後可以讀取所有數據。

  7. 在此代碼下方添加以下代碼以將影像保存到文件:

    with open('image.jpg', 'wb') as image_file:
        image_file.write(image.read())
    

    此代碼打開一個名為 image.jpg 的文件進行寫入,然後從 BytesIO 對象中讀取所有數據並寫入該文件。

    💁 您可以直接將影像捕捉到文件,而不是使用 BytesIO 對象,只需將文件名傳遞給 camera.capture 調用即可。使用 BytesIO 對象的原因是,在本課程的後續部分,您可以將影像發送到影像分類器。

  8. 將相機對準某個物體並運行此代碼。

  9. 一張影像將被捕捉並保存為當前資料夾中的 image.jpg 文件。您可以在 VS Code 的檔案瀏覽器中看到此文件。選擇該文件以查看影像。如果需要旋轉,請根據需要更新 camera.rotation = 0 行,然後重新拍攝。

💁 您可以在 code-camera/pi 資料夾中找到此代碼。

😀 您的相機程式成功了!


免責聲明
本文件已使用 AI 翻譯服務 Co-op Translator 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。