ARToolkitをAndroidで動かす! コンテンツWG 今村謙之 with ケイブ ©Japan Android Group, 2008
どんなもの? カメラ(ハードウェア連携)編 AR編 3D(OpenGL/ES)編 Agenda どんな可能性があるのか? Androidのお作法でカメラを使うには? AR編 ARの原理と基礎 3D(OpenGL/ES)編 OpenGL/ESの基礎 Androidのお作法でOpenGL/ESを使う という形で進める
ARとは? Augmented Reality:拡張現実感 マーカーを認識して、それがある場所に何かを表示させるもの まずは、見てください
Augmented Reality:拡張現実感 マーカーを認識して、それがある場所に何かを表示させるもの ARとは? Augmented Reality:拡張現実感 マーカーを認識して、それがある場所に何かを表示させるもの カメラによるリアル映像の取得 画像解析によるマーカーの検知 これが、ARToolkitのコア 3D(OpenGL/ES)による、モデル・オブジェクトの表示 当然、3DでなくてもOK。
マーカーを変更する マーカー検知後の動作を変える 何に使える? 道路標識、道路の交差点 顔認識 OpenCVによるいろいろな画像認識 カーナビと組み合わせる 顔認識 Android自体に入っている OpenCVによるいろいろな画像認識 画像識別、認識ライブラリ マーカー検知後の動作を変える 企業ロゴやお店の面構え ダイレクトメールが届く どこでもドア 画面の右端へ、ワープするなど ゲーム的な使い方 これからのトレンド 人間の五感に訴える 肌身離さず持つことができるデバイスだからこそ可能 これとWeb上のサービスを連携していくことが重要
カメラ(ハードウェア連携)編
Socketによる通信 Socketなカメラを扱う! private class CaptureThread extends Thread { public void run() { while (true) { try { Socket socket = new Socket(); socket.connect(IPAddress_and_Port, SOCKET_TIMEOUT); InputStream in = socket.getInputStream(); callback.onPreviewFrame(buf, null); } catch (Exception e) { ;; }
要は、ただのSocketプログラミング! 汎用性、抜群! Adamrockerさんのフライトシミュレータも利用 プロトコル設計が必要な場合
どう動くのか? カメラの画像を取得する G1実機のカメラ Camera.Open(); ↓ Camera.setPreviewDisplay(SurfaceView.Handler); Camera.setPreviewCallback(PreviewCallback); Camera.startPreview(); PreviewCallback.onPreviewFrame(byte[], Camera); BitmapFactory.decodeByArray(byte[], start, length);
Cameraを操作するためのクラス ハードウェアにアタッチするのだが、、、 Cameraクラス public class Camera { public static Camera open() { return new Camera(); } Camera() { // ここに変数の初期化がある。 native_setup(new WeakReference<Camera>(this)); private native final void native_setup(Object camera_this);
Androidでデバイスを扱うときのキモ Callback and Listener Androidでデバイスを扱うときのキモ データはこれにコールバックされる Cameraクラスの内部で定義されている public interface PreviewCallback { void onPreviewFrame(byte[] data, Camera camera); } 加速度センサーのLitener public interface SensorListener { public void onSensorChanged(int sensor, float[] values); public void onAccuracyChanged(int sensor, int accuracy); 登録先 Manager.registerListener(Listener); ApplicationContext.getSystemService(String name); ハードウェア的なところは、1月で!
G1実機のカメラ しかし、罠があった!!! Issue 823: byte[] image data in onPreviewFrame is currently useless http://code.google.com/p/android/issues/detail?id=823 Cameraからは、YCbCr_422_SP形式で取れるが、BitmapFactoryでは、それが読めない 対処法 YCbCr_422_SP形式を、読める形式に変換する Camera.takePicture(ShutterCB, PictureCB, JpegCB)を、使用する
AR編
解説すること 解説しないこと 原理 Android版との差分 ARToolkitの導入法 ARToolkitのプログラミング 最初に 基本を解説 Android版との差分 通常のARToolkitとの差分 解説しないこと ARToolkitの導入法 キャリブレーションなど ARToolkitのプログラミング
ポインタ紹介 ARToolkit本家 NyARToolkit(ARToolkit for MultiLang) 参考ページ http://www.hitl.washington.edu/artoolkit/ NyARToolkit(ARToolkit for MultiLang) http://nyatla.jp/nyartoolkit/wiki/index.php 参考ページ http://www1.bbiq.jp/kougaku/ARToolKit.html http://zoome.jp/specestone/diary/6/
2値化する ラベリングをする(閉領域を取り出す) 輪郭検出 四角検出 同じ色の領域を見つける 最初の点から、輪郭を なぞるように一周する マーカーの検知 2値化する ラベリングをする(閉領域を取り出す) 同じ色の領域を見つける 輪郭検出 最初の点から、輪郭を なぞるように一周する 四角検出 最初の点から、一番離 れた点を探す その2点の線分から 一番離れた点を探す
ほしいもの ここで、前提。 マーカーの位置 マーカーのサイズ マーカーの方向 マーカーの向きは、判定しておく 変換行列 ほしいもの マーカーの位置 マーカーのサイズ マーカーの方向 ここで、前提。 マーカーの向きは、判定しておく 画像マッチングを利用している 『キャリブレーションされた』平面が存在する カメラ位置(カメラ焦点)の決定
検知したマーカーの4辺を『キャリブレーション』平面に、カメラ焦点から射影する この平面に対する法線を引く 変換行列の算出 検知したマーカーの4辺を『キャリブレーション』平面に、カメラ焦点から射影する 各4辺とカメラ焦点による平面を作る この平面に対する法線を引く 向かい合った面同士の法線の外積を求める これが、ベクトルになる これら外積の外積を 求める これが、座標になる これで、回転行列完成 方向・サイズ決定 並進ベクトルを求める 残りの値で計算できる 位置決定
Androidでの特別なものはないです。 私が見た限りでは。
3D(OpenGL/ES)編
3D(OpenGL/ES) 別の資料を用意してきました
お知らせ 詳しくはいえませんが、、、 某所にて企画進行中
ご清聴ありがとうございました http://www.android-group.jp/ info@android-group.jp