Raspberry Pi3のカメラをAndroid Thingsで使う

Raspberry Pi3 のカメラモジュールをAndroid Things から使用してみます。

■公式


https://developer.android.com/things/training/doorbell/camera-input.html

ほぼ公式の通りですぐに試せます。

 

■Manifestにパーミッションを追加


普通のAndroidアプリと同様にマニフェストにカメラ許可を追加。

 

■カメラを使う側の処理


今回はカメラ画像をキャプチャしてImageViewに貼り付けるだけにします。

モニターがないと確認できないので接続しておいてください。

カメラ用の作業スレッドを作成


メインスレッドをブロックさせないために作業スレッドを作成する。
androidでのthreadは他にもありますが、ここでは公式のオススメ通りにHandlerThreadを使用する。

ATCameraというクラスを作成してカメラを制御するようにし、Activityから使用します。

ATCameraクラスの作成は後回しにして、できているつもりで使用する側を先に記載します。

キャプチャ実行


プッシュボタン等のトリガーによりキャプチャを実行する。UARTの設定ができていれば、とりあえずUARTからのコマンド受信をトリガーにするのも楽かも。

 

キャプチャできたデータを受け取って表示する


initializeCameraに指定するリスナーのonImageAvailable()で画像データが取得できるので、Bitmapに変換してImageViewに貼り付ける。

 

■カメラ制御用クラスの中身


Camera用クラスを作成


 

カメラ初期化処理


・CameraManagerというシステムサービスのgetCameraIdList()を使って利用可能なカメラデバイスをリストアップする。(カメラモジュールは1つしか繋いでないので最初のidを使用します。)

・ImageReaderというクラスのインスタンスを使用してカメラ画をjpegにする。非同期処理してくれて処理完了時にOnImageAvailableListenerに教えてくれる。

・openCamera()でカメラへアクセスすると、CameraDevice.StateCallback のonOpened()メソッドでオープンできたかのレポートが得られる。

 

デバイスのステータス変化をコールバックしてもらう受け皿を作成


 

外部から呼び出してもらう画像キャプチャ開始メソッドを作成


Activityから呼び出されるメソッド takePicture( )を作成し、この中でキャプチャセッションというのを作成する。

またその際に指定する、キャプチャセッションのステータス変化をコールバックしてくれる受け皿を作成する。

キャプチャセッション作成が成功するとonConfiguredに入ってくるので、キャプチャを実行(triggerImageCapture() )する。

ここではCaptureRequestというのを作成、ターゲットに最初に作成したImageReaderを設定、その他のパラメータも設定。

capture( )を実行すると時に指定する処理結果コールバックのonCaptureCompleted( )が呼び出される。