ARToolkit_for_android

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