はじめに

RPiCarにはRaspberry Pi専用カメラ Raspberry Pi Camera V2が備わっていて,RPiCar前方の様子を撮影できます.ここではこのカメラを制御するCameraクラスの使用方法について述べます.

環境

  • OS: Raspberry Pi OS Bulleyes
  • Java: OpenSDK Version 11
  • プログラミングを行うパソコン: Ubuntu 20.2
  • IDE: Visial Studio Code Version 1.72.2
  • カメラ: Raspberry Pi Camera V2

カメラに関するクラス図

今回,RPいCarに備わる多くのデバイスを制御するときにはPi4Jを用いています.しかし,カメラを制御するCameraクラスについてはPi4Jではなく,シェル上で動作する”libcamera-still”というコマンドを使っています.このコマンドを文字列として生成し,それをシェルで実行させるようなプログラムを作ってあります.このコマンドを実行すると指定された場所に画像ファイルを保存しますので,ユーザはその画像ファイルを撮影後に処理することになります.

下にカメラに関するクラス図を示します.CameraクラスにあるtakePictureメソッドにより撮影が行われます.撮影される画像サイズ,フォーマット,ファイル名,ディレクトリ名の諸情報は各setterで指定できます.なお,デフォルトで諸情報は指定されています.それらを確認するため,getterも備わっています.

フォーマットはCameraクラス内にあるFormatクラス(enum)で定義されています.クラス図では丸に+の記号がCameraクラスとFormatクラスの間にある線の端についています.これはFormatクラスがCamerakurasuninaihousiteirukotowosimesiteimasu. このため,例えばPNGを使用するときにはCamera.Format.PNGというように指定することになります.

Cameraクラスを使う上でいくつかの例外が発生します.例えば画像の幅を指定する際,負の数が与えられるとInvalidImageSizeException例外が投げられます.同様に存在しないディレクトリを指定した場合にはInvalidDirectoryException,撮影を実行するコマンドにて正常に終了しなかったことを表すコードが返却された場合にはCameraRuntimeExceptionがそれぞれ投げられます.

ClassDiagram

 

プログラム

ではプログラムを作っていきましょう.下のプログラムをご覧ください.Cameraクラスのインスタンスを取得したのち,画像サイズ,ファイル名,フォーマットをsetterで指定しています.その後,takePictureコマンドでFileクラスとして取得しています.先ほども説明した通り,撮影した画像はファイルとして保存されます.その保存されたファイルが戻り値になっています.撮影した画像を処理する場合,このファイルを開いてください.

    public static void main(String[] args) throws Exception {

        Camera camera = Camera.getInstance();
        camera.setWidth(3280)
                .setHeight(2464)
                .setFileName("Test")
                .setFormat(Camera.Format.JPG);

        File file = camera.takePicture();

        System.out.println(file.getAbsolutePath());
    }

どうでしょうか.表示された画像ファイルが確認できたでしょうか.