ARToolkitをAndroidで動かす! コンテンツWG 今村謙之 with ケイブ ©Japan Android Group, 2008 1 Agenda どんなもの? どんな可能性があるのか? カメラ(ハードウェア連携)編 Androidのお作法でカメラを使うには? AR編 ARの原理と基礎 3D(OpenGL/ES)編 OpenGL/ESの基礎 Androidのお作法でOpenGL/ESを使う ©Japan Android Group, 2008 2 ARとは? Augmented Reality:拡張現実感 マーカーを認識して、それがある場所に何かを 表示させるもの まずは、見てください ©Japan Android Group, 2008 3 ARとは? Augmented Reality:拡張現実感 マーカーを認識して、それがある場所に何 かを表示させるもの カメラによるリアル映像の取得 画像解析によるマーカーの検知 これが、ARToolkitのコア 3D(OpenGL/ES)による、モデル・オブジェクトの 表示 当然、3DでなくてもOK。 ©Japan Android Group, 2008 4 何に使える? マーカーを変更する 道路標識、道路の交差点 カーナビと組み合わせる 顔認識 Android自体に入っている OpenCVによるいろいろな画像認識 画像識別、認識ライブラリ マーカー検知後の動作を変える 企業ロゴやお店の面構え ダイレクトメールが届く どこでもドア 画面の右端へ、ワープするなど ゲーム的な使い方 ©Japan Android Group, 2008 5 カメラ(ハードウェア連携)編 ©Japan Android Group, 2008 6 Socketなカメラを扱う! 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) { ;; } } } } ©Japan Android Group, 2008 7 Socketプログラミング 要は、ただのSocketプログラミング! 汎用性、抜群! Adamrockerさんのフライトシミュレータも利用 プロトコル設計が必要な場合 ©Japan Android Group, 2008 8 G1実機のカメラ どう動くのか? カメラの画像を取得する Camera.Open(); ↓ Camera.setPreviewDisplay(SurfaceView.Handler); ↓ Camera.setPreviewCallback(PreviewCallback); ↓ Camera.startPreview(); ↓ PreviewCallback.onPreviewFrame(byte[], Camera); ↓ BitmapFactory.decodeByArray(byte[], start, length); ©Japan Android Group, 2008 9 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); } ©Japan Android Group, 2008 10 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); ©Japan Android Group, 2008 11 G1実機のカメラ しかし、罠があった!!! Issue 823: byte[] image data in onPreviewFrame is currently useless http://code.google.com/p/android/issues/detail?id=8 23 Cameraからは、YCbCr_422_SP形式で取れるが、 BitmapFactoryでは、それが読めない 対処法 YCbCr_422_SP形式を、読める形式に変換する Camera.takePicture(ShutterCB, PictureCB, JpegCB)を、使用する ©Japan Android Group, 2008 12 AR編 ©Japan Android Group, 2008 13 最初に 解説すること 原理 基本を解説 Android版との差分 通常のARToolkitとの差分 解説しないこと ARToolkitの導入法 キャリブレーションなど ARToolkitのプログラミング ©Japan Android Group, 2008 14 ポインタ紹介 ARToolkit本家 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/ ©Japan Android Group, 2008 15 マーカーの検知 2値化する ラベリングをする(閉領域を取り出す) 同じ色の領域を見つける 輪郭検出 最初の点から、輪郭を なぞるように一周する 四角検出 最初の点から、一番離 れた点を探す その2点の線分から 一番離れた点を探す ©Japan Android Group, 2008 16 変換行列 ほしいもの マーカーの位置 マーカーのサイズ マーカーの方向 ここで、前提。 マーカーの向きは、判定しておく 画像マッチングを利用している 『キャリブレーションされた』平面が存在する カメラ位置(カメラ焦点)の決定 ©Japan Android Group, 2008 17 変換行列の算出 検知したマーカーの4辺を『キャリブレーション』平 面に、カメラ焦点から射影する 各4辺とカメラ焦点による平面を作る この平面に対する法線を引く 向かい合った面同士の法線の外積を求める これが、ベクトルになる これら外積の外積を 求める これが、座標になる これで、回転行列完成 方向・サイズ決定 並進ベクトルを求める 残りの値で計算できる 位置決定 ©Japan Android Group, 2008 18 Android版のお話 Androidでの特別なものはないです。 私が見た限りでは。 ©Japan Android Group, 2008 19 3D(OpenGL/ES)編 ©Japan Android Group, 2008 20 3D(OpenGL/ES) 別の資料を用意してきました ©Japan Android Group, 2008 21 お知らせ 詳しくはいえませんが、、、 某所にて企画進行中 ©Japan Android Group, 2008 22 ご清聴ありがとうございました http://www.android-group.jp/ [email protected] ©Japan Android Group, 2008 23
© Copyright 2024 ExpyDoc