家族目線(HVC-C2W)SDKモニター当選したのでまずは開発手順をメモしておきます

家族目線(HVC-C2W)SDKモニターとして本体をお借りしております。早速SDKをダウンロードしてサンプルを動かしてみたいと思います。備忘録として開発までの手順をここにメモしていきます。
モニターの詳細についてはこちら。
http://plus-sensing.omron.co.jp/egg-project/fordeveloper20151113_sdk-monitor/
まずは、環境構築から。Mac環境での説明になります。

Xcodeのインストール(gitが欲しいため)。

Xcodeをインストールしたら一度起動しておきます。

GitHubアカウントの作成

アカウントを作成しておきましょう。
アカウント作成手順はこちらを参照
 

Sensing Egg Projectのアカウント作成

DEVELOPERのページへ行き、アカウントを作成します。

Forkする

DEVELOPERのページからGithubへのリンクをたどってAndroid版SDKのページを開きます。右上のForkボタンを押して自分のGithubアカウントへForkします。
fork
clone用にフォルダを作成しておきます。フォルダに移動し、Forkしたコードをcloneします。

$ cd ~/Documents/Develop/HVC-C2W/github/
$ git clone https://github.com/emboss369/HVC_C2W_SDK_Android.git

ローカルにブランチ「sample_extension」を作成します。

$ cd HVC_C2W_SDK_Android
$ git checkout -b sample_extension
Switched to a new branch 'sample_extension'

ブランチ確認

$ git branch
 master
* sample_extension

オリジナルのリポジトリの更新を取り込めるようにします。

$ git remote add upstream https://github.com/OmronSensingEggProject/HVC_C2W_SDK_Android.git
 $ git branch -a
 master
 * sample_extension
 remotes/origin/HEAD -> origin/master
 remotes/origin/master

参考:http://kik.xii.jp/archives/179

Sampleを動かしてみる

AndroidStudioを起動し、Sampleを読み込みます。

openanexisting

Opne an existing Android Studio projectをクリック。フォルダ選択画面で次のフォルダを選択して開きます。

~/Documents/Develop/HVC-C2W/github/HVC_C2W_SDK_Android/sample/demo/base

MainActivity.javaを開き、APIキーを書き換えて実行すると、サンプルを実行できます。

    /** Omronから取得したAPIキー */
    private static final String API_KEY = "API_KEY"; // 取得したキーに置き換える

実行すると次のような画面になります。
demo_Screenshot
 

アカウントが既に作成済みなら、メールアドレスとパスワードを入力し「LOGIN」ボタンを押します。

ログインできたら、Network Nameに検出されたWiFiネットワークが 表示されていますので、選択します。WiFIルーターのパスワードを入力し、家族目線のボタンを長押ししてから、CONNECTボタンを押すと、音声でネットワーク名とパスワードが家族目線に送られ、家族目線がネットワークに接続されます。

「EXECUTE」ボタンを押すと、人物検知が行われ、ログに検知した人数、位置、年齡などが表示されれば動作確認までOKです。

2回目以降は、メールアドレスとパスワードを入力し「LOGIN」、「RELOAD」でカメラの一覧を取得して「SET」してから「EXECUTE」です。

Sampleを改良する。

このままでは、どの人物をどのように認識したのかわかりません。画像を表示できるようにサンプルを改良してみます。

    private void getLastOkaoImage() {
        addLog("getLastOkaoImage ->");
        new Thread(new Runnable() {
            @Override
            public void run() {
                Int imageBufSize = new Int();
                Int returnStatus = new Int();
                // 最新の OKAO 実行時の画像サイズを取得
                int ret = api.getLastOkaoImageSize(imageBufSize, returnStatus);
                final String msg1 = String.format("errorCode=%d,imageBufSize=%d,returnStatus=%#x",
                        ret,
                        imageBufSize.getIntValue(),
                        returnStatus.getIntValue());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        addLog(msg1);
                    }
                });
                if (ret != ErrorCodes.HVCW_SUCCESS) return;
                byte[] image = new byte[imageBufSize.getIntValue()];
                // 最新の OKAO 実行時の画像取得
                ret = api.getLastOkaoImage(imageBufSize.getIntValue(), image, returnStatus);
                final String msg2 = String.format("errorCode=%d,returnStatus=%#x",
                        ret,
                        returnStatus.getIntValue());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        addLog(msg2);
                    }
                });
                if (ret != ErrorCodes.HVCW_SUCCESS) return;
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Bitmap.Config.ARGB_4444;
                if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                    //noinspection deprecation
                    options.inPurgeable = true;
                }
                final Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length, options);
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        showImage(bitmap);
                    }
                });
            }
        }).start();
    }

getLastOkaoImageSizeでビットマップのサイズを取得してから、getLastOkaoImageでビットマップを取得します。取得したビットマップはshowImageメソッド内でImageViewに表示しています。
せっかくなので作成したサンプルはPull requestしておきましょう。
変更をコミット

$ git commit -m "Additional image acquisition sample"

Forkしたリポジトリにpush

$ git push origin sample_imp

GithubのサイトでForkしたプロジェクトを開きます。Compare & pull requestをクリックします。
gitfork
 
差分を確認することができます。問題なければ、あとはコメントを書いて送信すればOKです。

SDKを使ってみた感想

まだSDKとしては整備されておらず、JNIインタフェースそのまんま、Cの関数そのままといった形なので、ちょっと敷居が高いなという感じです。もう少しJavaで取り扱いやすいようにラップしたクラスを用意すれば、開発者も増えると思います。またgetLastOkaoImageを呼ぶためには必ず先にgetLastOkaoImageSizeを呼ぶ、といった決まりごとも多いため、その辺はSDKでひとまとめにしてあげればさらに敷居が下がり使いやすくなると思いました。
また、ステータスとして戻り値とpucReturnStatusの2つの値が戻されるのもわかりずらいので、リターンコード・pucReturnStatus・できればリターンコードの文字列をResultクラス等にひとまとめに戻れば使いやすいのではないかと思います。

家族目線、これ使えるアイテムですよ

家族目線自体は素晴らしいアイテムです。画像認識をカジッた人ならわかると思いますが、高度な顔認識や認証機能などがハードウェアで処理されて結果が帰ってくるんですよ!今まで一生懸命カメラとOvenCVでやってた処理をさくっと行ってくれます。こいつは使えます!願わくはもっともっと使いやすいSDKになって敷居が下がり、面白いアプリがたくさんリリースされると良いですね〜!
標準アプリでも十分な家族目線ですが、これから自宅のリビングに置くことを想定して、自分の欲しい機能を色々盛り込んだアプリを作ってみたいと思っています!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です