2012年8月29日水曜日

[Android]FaceDetectorを使う


画像から顔を検出する方法です。

FaceDetectorは、Android4.0から使用可能。


final int MAX_FACES = 4;

// Config.RGB_565で画像作成
Bitmap temp = Bitmap.createBitmap(width, height, Config.RGB_565);
Canvas canvas = new Canvas(temp);
canvas.drawColor(0x00000000);
canvas.drawBitmap(bmp, 0, 0, new Paint());
canvas.save();


Face[] faces = new Face[MAX_FACES];
FaceDetector detector = new FaceDetector(temp.getWidth(), temp.getHeight(), MAX_FACES);
int numFaces = detector.findFaces(temp, faces);

if(numFaces > 0) {
    // 認識した数だけ処理
    for (int i = 0 ; i < numFaces ; i++) {
        Face face = faces[i];
       
        // 顔認識結果を取得
        face.getMidPoint(midPoint);        // 中心座標を取得
        eyesDistance = face.eyesDistance();    // 目の間隔を取得
    }
}


画像は、Config.RGB_565 にしないと、
顔検出時にエラーになります。

取得できる特徴点が少ない。。

2012年8月28日火曜日

[Android]AES暗号化と復号化

Android側で暗号化したデータをサーバに送信し、
サーバ側(php)でデータを復号を行ったときのメモ。


Androidアプリ


String encodeKey = "YOUR_ENCODE_KEY";
String value = "ENCODE_VALUE";

// キー生成
SecretKey key = new SecretKeySpec(encodeKey.getBytes(), "AES");
// 初期化
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
// エンコード処理
byte[] encryptBin = cipher.doFinal(value.getBytes());
// BASE64に変換
String encodedValue = new String(Base64.encode(encryptBin, Base64.DEFAULT));




サーバ(PHP)



function mc_decrypt($decrypt) {
$mc_key = 'YOUR_ENCODE_KEY';
$decoded = base64_decode($decrypt);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
    return rtrim( pkcs5_unpad($decrypted) ); } function pkcs5_unpad($text) { $pad = ord($text{strlen($text)-1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); }



2012年8月7日火曜日

[Android]metaio Mobile SDKのアプリ登録方法

metaio Mobile SDKのサンプルから自分用のアプリを作成するために、
パッケージ名を変更すると、以下のようなログが出力されてしまいます。


Could not verify the application name <package name>. Please check docs.metaio.com for more details.
License check failed
License was not valid
Error createing unifeye mobile: null


ライセンスエラー、認証エラーですね。。

この認証チェックですが、どこを見ているのかというと、
Configuration.java のsignatureという値を見ているようです。

public static final String signature = "Ig1hNdxRO52rNP9Qn1NPz13pGkIoXjHxgclAV26cEFI=";

このシグネチャーをどうやって取得すればいいかというと、
metaio Developer Portal から取得できました。
https://mobiledeveloperportal.ar-live.de/index.php?


ログインすると、
・Application Name
・Application ID
を入力すると、signatureを生成してくれるので、
Configuration.java のsignatureを書き換えると認証OKとなります。
※Application IDはパッケージ名を入力


参照
http://docs.metaio.com/bin/view/Main/ApplicationSignature

2012年8月6日月曜日

[Android]マーカーレスARライブラリ比較

マーカーレスARを実現するために必要なライブラリをまとめてみました。


・SATCH SDK

 http://satch.jp/jp/
 ・・・KDDIが運営しているARライブラリ。
   開発ガイド、APIリファレンス、サンプルなど資料が豊富。
   アプリ作成には開発者登録、アプリ登録が必要。
   資料はすべて日本語。


・metaio Mobile SDK


 http://www.metaio.com/software/mobile-sdk/
 ・・・英語。
   JARを追加するだけで利用可能。
   トラック画像(認識するための画像)もプロジェクト内に登録するだけで可能。
   無料版ではカメラビューに透かし画像が表示される。

・Vuforia

 http://www.qualcomm.com/solutions/augmented-reality
 ・・・Qualcommの提供するARライブラリ。英語
   ビルドにはAndroid NDKが必要。
   トラックデータはウェブサイトにて登録・取得。
   単純なトラック画像では認識率が悪い(登録時に確認可能)


・OpenCV

 http://opencv.jp/
 ・・・オープンソースライブラリ。
   画像認識・変換などが行える。
   認識率はmetaio や Vuforiaより劣る。
   Android NDKが必要。




SATCHは日本語が充実していて、開発ツールも用意されているので、初めての人でもとっつきやすそう。
(あまりさわったことないので、詳細不明。)


metaio Mobile SDKは、
JARファイルを追加するだけの簡単設計。
Android NDKが不要な点が利点。
無料版はスプラッシュ画像、カメラビューに透かしが表示される。
トラックデータや、3Dモデルもxmlに追加するだけ。
フォーラムありますが、情報が英語しかないので、ちょっとつらい。
日本語の情報も少なめ。


Vuforiaは、
Android NDKが必要な点がハードル高め。
トラック画像を選ぶのが難点。(画像によっては認識率悪い。サイト側で登録できない。。)
トラックデータはサイトから取得しないと行けない。


OpenCVは、
画像認識部分を利用。
簡単にトラック画像を登録できますが、認識速度、認識率が悪い。
Android NDKが必要な点がハードル高め。
3Dオブジェクトの表示部分は自分で実装必要??

[Android]ARライブラリ「vuforia」のサンプル実行

QualcommさんのARライブラリの名称がいつの間にか「QCAR」から「Vuforia」に変わっていたので、
改めてサンプル実行してみました。
追加された2つのみ。

Vuforiaの環境設定などは以前の記事を参照のこと。
Getting Signals: Android NDK環境構築
Getting Signals: Qualcom「QCAR」のサンプル実行
Getting Signals: Qualcomm「QCAR」のImageTargetsの認識画像を ...
Getting Signals: Qualcomm「QCAR」のImageTargetsの表示画像を ...



BackgroundTextureAccess
背景がグレースケールで表示される。
タッチすると背景が歪む。


・OcclusionManagement
6面体を認識


組み立てて認識すると...もっと分かり易くなるはず。

2012年8月3日金曜日

[Android]OpenCVの環境構築とndk-build


Android NDK関連の記事はMacやLinuxベース名ことが多いので、
Windows環境では少々困ることがあるので、備忘メモ。

@ITさんの「オープンソースの「OpenCV」で画像認識しよう」を参考に。
http://www.atmarkit.co.jp/fsmart/articles/armobile06/01.html

環境構築は↓を参考に。
http://www.kosaic.jp/wordpress/2011/08/opencv4android-2-3-1beta2-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86%EF%BC%88%E7%94%BB%E5%83%8F%E4%BB%98%E3%81%8D%EF%BC%89/
Cygwin
c:\Cygwin

OpenCV
OpenCV-2.3.1-android-bin.tar.bz2
SDKと同じ場所に解凍
i:\Development\に解凍
同じ階層に
i:\Development\android-sdk-windows
i:\Development\OpenCV-2.3.1
i:\Development\samples


Android NDK r8b
android-ndk-r8b-windows.zip


c:\r8bに解凍



PC環境
Wndows Vista 32bit Ultimate


環境変数に設定
c:\Cygwin\home\[ユーザー名]\.bashrcの末尾に


export ANDROID_NDK_ROOT=/cygdrive/c/r8b
export PATH=$ANDROID_NDK_ROOT:$PATH


を追記

sampleをndk-buildする

i:\Development\samples\tutorial-3-native
をeclipseにインポート

cygwinから
cd cygdrive/c/Development/samples/tutorial-3-native

ndk-build

プロジェクトをリフレッシュして、実行


@ITのサンプル(detect_image_sample)をndk-buildする

detect_image_sample.zipを↓に解凍
i:\Development\samples\detect_image_sample

eclipseにインポート

OPENCV_MK_PATHの設定を変更
Android.mk内の

include $(OPENCV_MK_PATH)



include ../includeOpenCV.mk
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif

に変更。




cygwinから
cd cygdrive/c/Development/samples/detect_image_sample


ndk-build


プロジェクトをリフレッシュして、実行