Google OS実験室 ~Moonlight 明日香~

GoogleのAndroidで遊び始めて, すでに6年以上が経った. Androidは思った以上の発展を遂げている. この技術を使って, 新しいことにチャレンジだ!!

OKAO Visionがやってきた!!(5)

写真を撮るとき, 被写体の一瞬の表情を見逃さずに撮影するのは難しいものである.
そこで, HVC-Cを使ってシャッターチャンスを逃さないカメラアプリを作成してみた.

特長は, 普通の表情では撮影できない仕組みとなっており, シャッターを切るには喜怒哀楽のある表情をする必要があること.

1. システム構成
システム構成は以下のようになっている.

camera01

2. コード
表情推定機能を使い, 喜び, 驚き, 怒り, 悲しみの表情でスコアが閾値以上のときにカメラのシャッターを切るようにする.

2.1 src/MainActivity.java
SimpleDemoをベースとしていて, 認識結果の関連部分は以下の通り.
    @Override
    public void onPostExecute(int nRet, byte outStatus) {
     : (省略)
        if ( (hvcRes.executedFunc & HVC.HVC_ACTIV_EXPRESSION_ESTIMATION) != 0 ) {
            str += String.format("  [Expression Estimation] : expression = %s, score = %d, degree = %d\n", 
                faceResult.exp.expression == HVC.HVC_EX_NEUTRAL ? "Neutral" :
                faceResult.exp.expression == HVC.HVC_EX_HAPPINESS ? "Happiness" :
                faceResult.exp.expression == HVC.HVC_EX_SURPRISE ? "Supprise" :
                faceResult.exp.expression == HVC.HVC_EX_ANGER ? "Anger" :
                faceResult.exp.expression == HVC.HVC_EX_SADNESS ? "Sadness" : "" ,
                faceResult.exp.score, faceResult.exp.degree);
            if (faceResult.exp.expression == HVC.HVC_EX_ANGER ||
                faceResult.exp.expression == HVC.HVC_EX_HAPPINESS ||
                faceResult.exp.expression == HVC.HVC_EX_SURPRISE ||
                faceResult.exp.expression == HVC.HVC_EX_SADNESS) {
                if (faceResult.exp.score > SCORE_THRESHOLD) {  // score > 80 
                   mView.takePicture();
                }      
            }
        }

2.2 カメラ処理[1]
Androidプログラマへの道 ~Moonlight 明日香~」のカメラの部分を参照.

3. 動作例


撮影した写真
camera02

顔の表情に応じて, 写真をデコレーション(例:「怒り」なら頭の位置に鬼の角の画像を貼り付ける)する機能を実装したかったが, 明日(12/15)が締切なのでいったんこれで Sensing Egg Project 事務局に連絡しよう~と.

デコレーション機能やGUIをちゃんと実装したら, またこちらで紹介します.

----
参照URL:
[1] Androidプログラマへの道 ~Moonlight 明日香~

OKAO Visionがやってきた!!(4)

もうすぐクリスマスだ~.
ということで, HVC-Cを使ってクリスマスツリーのLEDイルミネーションの制御にチャレンジしてみた.

1. システム構成
システム構成は以下のようになっている.
tree01

注) LEDイルミネーションは以下のものをばらして使用した.


2. コード[1]
考え方は, 「OKAO Visionがやってきた!!(3)」と同じである.

2.1 Android側
SimpleDemoをベースとしていて, 認識結果の関連部分は以下の通り.
     @Override
      public void onPostExecute(int nRet, byte outStatus) {
      byte[] cmd = new byte[2];
     : (省略)
      if ( (hvcRes.executedFunc & HVC.HVC_ACTIV_EXPRESSION_ESTIMATION) != 0 ) {
          str += String.format("  [Expression Estimation] : expression = %s, score = %d, degree = %d\n", 
              faceResult.exp.expression == HVC.HVC_EX_NEUTRAL ? "Neutral" :
              faceResult.exp.expression == HVC.HVC_EX_HAPPINESS ? "Happiness" :
              faceResult.exp.expression == HVC.HVC_EX_SURPRISE ? "Supprise" :
              faceResult.exp.expression == HVC.HVC_EX_ANGER ? "Anger" :
              faceResult.exp.expression == HVC.HVC_EX_SADNESS ? "Sadness" : "" ,
              faceResult.exp.score, faceResult.exp.degree);
          if (faceResult.exp.expression == HVC.HVC_EX_HAPPINESS) {
              cmd[0] = '4';
          }
          else if (faceResult.exp.expression == HVC.HVC_EX_SURPRISE) {
              cmd[0] = '3';                   
          }
          else if (faceResult.exp.expression == HVC.HVC_EX_NEUTRAL) {
              cmd[0] = '2';                   
          }
          else if (faceResult.exp.expression == HVC.HVC_EX_ANGER) {
              cmd[0] = '1'; 
          }
          else { // HVC.HVC_EX_SADNESS
              cmd[0] = '0';      
          }
          mUsb.write(cmd, 1);
      }
 
2.2 Arudino側
Androidからのコマンドにより, LEDの点滅時間を変えている.
char mCtrlPin = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode(mCtrlPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int high[] = { 100, 300, 1000, 300, 50};
  int low[] = { 2000, 1000, 1000,300, 50};
  int level = 2;    // default  
  while (true) {
    if (Serial.available() > 0) {
      level = Serial.parseInt();
      if (level < 0)  level = 0;
      else if (level > 4)  level = 4;
    }
    if (high[level] > 0) {
      digitalWrite(mCtrlPin, HIGH);
      delay(high[level]);
    }
    if (low[level] > 0) {
      digitalWrite(mCtrlPin, LOW);
      delay(low[level]);
    }
  }
  delay(10);
}

3. 動作例


とりあえず第一弾のプロトタイプということで, Sensing Egg Project 事務局に連絡だ~.

----
参照URL:
 [1] OKAO Visionがやってきた!!(3)

livedoor プロフィール
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索



  • ライブドアブログ