跳至主要内容

捕捉影像 - 樹莓派

在本課程中,你將為樹莓派添加一個相機感測器,並從中讀取影像。

硬體

樹莓派需要一個相機。

你將使用的相機是Raspberry Pi Camera Module。這款相機專為樹莓派設計,通過樹莓派上的專用連接器連接。

💁 這款相機使用Camera Serial Interface,一種來自移動產業處理器接口聯盟的協議,簡稱MIPI-CSI。這是一種專用的影像傳輸協議。

連接相機

可以使用排線將相機連接到樹莓派。

任務 - 連接相機

樹莓派相機

  1. 關閉樹莓派電源。

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

    你可以在Raspberry Pi Getting Started with the Camera module documentation中找到顯示如何打開夾子和插入排線的動畫。

    排線插入相機模組

  3. 從樹莓派上取下Grove Base Hat。

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

    排線穿過Grove Base Hat

  5. 將排線插入樹莓派上的相機端口。再次拉起黑色塑料夾,插入排線,然後推回夾子。排線的藍色面應朝向USB和以太網端口。

    排線連接到樹莓派上的相機插座

  6. 重新安裝Grove Base Hat。

編程相機

現在可以使用PiCamera Python庫來編程樹莓派以使用相機。

任務 - 啟用傳統相機模式

不幸的是,隨著Raspberry Pi OS Bullseye的發布,操作系統附帶的相機軟體發生了變化,這意味著默認情況下PiCamera不再工作。目前正在開發一個替代品,稱為PiCamera2,但尚未準備好使用。

目前,你可以將樹莓派設置為傳統相機模式,以允許PiCamera工作。相機插座默認情況下也是禁用的,但啟用傳統相機軟體會自動啟用插座。

  1. 啟動樹莓派並等待其啟動。

  2. 啟動VS Code,可以直接在樹莓派上啟動,也可以通過Remote SSH擴展連接。

  3. 從終端運行以下命令:

    sudo raspi-config nonint do_legacy 0
    sudo reboot

    這將切換設置以啟用傳統相機軟體,然後重新啟動樹莓派以使該設置生效。

  4. 等待樹莓派重新啟動,然後重新啟動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對象中的所有數據並將其寫入文件。

    💁 你可以通過將文件名傳遞給camera.capture調用來直接將影像捕捉到文件中。使用BytesIO對象的原因是稍後在本課程中你可以將影像發送到你的影像分類器。

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

  9. 將捕捉到的影像保存為當前文件夾中的image.jpg。你會在VS Code資源管理器中看到此文件。選擇該文件以查看影像。如果需要旋轉,根據需要更新camera.rotation = 0行並重新拍攝照片。

💁 你可以在code-camera/pi文件夾中找到此代碼。

😀 你的相機程式成功了!