https://gyazo.com/52ce7ebbce4cb3079c55c9dce75ece7f

ロボホンのカメラ

ロボホンの開発キットRoBoHoN Software Development Kitに 同梱されているカメラ用のアプリ SampleCamera を基にQRコードの読み取り機能を実装します。 QRコードの読み取りには、オープンソースとして提供されているZXingを採用します。 ちなみに、 ZXing の名称は Zebra Crossing が基になっているようです。 ZXing の実装方法はNAVERまとめの記事「Java QRコード読み取り」を参考にし、 ライブラリはMaven RepositoryからダウンロードしたJARファイルを利用します。 現時点での最新バージョンは 3.3.0 です(2017年9月20日現在)。

カメラの利用

まずは、SampleCamera のプロジェクトを Android Studio で開き確認しましょう。 MainActivity.javaがこのサンプルの中心となるソースファイルです。

ロボホンのカメラを利用した撮影には、静止画、動画、また、顔認識の有無などの設定が可能です。 ここでは、写真撮影 顔認識無ボタン の挙動にQRコードの読み取り機能を加えます。 下記が該当部分のソースコードです。 背面のモニタにあるcameraButtonをタップすると、getIntentForPhoto メソッドの 返り値(Intent クラスのインスタンス)が、sendBroadcast メソッドで通知される処理となっていることが分かります。

次に、getIntentForPhoto メソッドを確認します。 ここで、登場する ShootMediaUtil クラスが重要な役割を担います。 Intent クラスのコンストラクタの引数には静止画撮影用のアクション名であるShotMediaUtil.ACTION_SHOOT_IMAGEを指定します。 また、アクション(撮影)終了後の結果通知を得るために、putExtraメソッドで ShotMediaUtil.EXTRA_REPLYTO_ACTIONを指定し、 ACTION_RESULT_TAKE_PICTURE をその返り値としています。 このインテントを sendBroadcast で通知することで、カメラの撮影機能が実行されます。

カメラの撮影後には、結果通知として ACTION_RESULT_TAKE_PICTURECameraResultReceiver クラスの onReceive メソッドで受け取ります。 ここでは、ACTION_RESULT_TAKE_PICTURE に該当するコードのみを抜き出してみます。 撮影が成功していれば、インテントから ShootMediaUtil.RESULT_OK を受け取り、 保存した画像ファイルのパスを取得します。 取得されたパスは、リソースIDを利用して、ロボホンの背面の TextView に表示されます。

このプログラムを実行した様子は下記です。

QRコード読み取りの実装

最初にダウンロードしたZXingのライブラリ(corejavase)をプロジェクトにインポートします。 [File]-[Project Structure]-[app]-[Dependencies]を選択し、 該当するJARファイル(ここでは zxing-core-3.3.0.jarzxing-javase-3.3.0.jar)を追加します。

https://gyazo.com/5822a111adc0ce68b9505fcb4b866e0e

加えてマニフェストファイルにも修正が必要です。 AndroidManifest.xmlにファイルの読み取り権限の許可を与える下記のタグを追加してください。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

一般にQRコードを読み取るときは、カメラの映像を確認しながら、画面に写っているQRコードを認識させます。 しかし、現在のロボホンのSDKでは、撮影時の挙動に介在できないため、保存された画像ファイルに写っているQRコードを読み取ることにします。 それでは、撮影後のコードを下記のように書き換えます。

最初に撮影した画像ファイル(JPG形式)を Bitmap クラスで読み込みます。 これをピクセルのARGB成分の配列に変換し、配列pixelsに代入します。

次に、配列pixelsを基に、2値画像の BinaryBitmapクラスに変換し、 これを QRCodeReader クラスの decodeメソッドに引数として渡します。 読み取った結果は Result クラスに代入され、 QRコードを変換した文字列は getTextメソッドで取得することが可能となります。

この文字列を mSpeachText に代入することで、 ACCOSTを利用してロボホンに発話をさせることが出来ます。

それでは、プログラムを実行してみます。 今回は「むかいせんせい」という文字列から生成した下記のQRコードを読み取ることにします。 読み取りに成功するとロボホンは「認識した結果は むかいせんせい だよ」と発話します。

https://gyazo.com/bc395c563d0375b86b3bc3812dc8990e

何度か試してみましたが、静止画を対象としているためか、認識精度が非常に低いです(5回に1回が良いところ)。 また、認識にかかる時間も決して短くはなく、残念ながら現状では使い物にならないという印象です。 改善出来る方法があれば誰か教えて頂きたいです。

参考書籍