2008年5月30日金曜日

【拡張現実AR】 改:マーカーなしで拡張現実

今回は少し改良を加えたのでその内容について。

マーカーなしのARでは3Dオブジェクトの表示場所が定められていない。
そこで、ユーザがマウスでクリックした位置を3Dオブジェクトの表示位置にすることにした。

マーカーなしで拡張現実3


マーカーなしで拡張現実4


クリックした周辺の特徴を使ってトラッキングを開始する。
枠内の物体が剛体であることが前提だが、移動量の分散値が大きい場合はテンプレートマッチングから除外されるので、それらしくトラッキングができる。

実行環境と開発環境は【拡張現実AR】 マーカーなしで拡張現実と同じだ。

ラベル:

2008年5月28日水曜日

【Java】 Java3Dでメタセコイアのモデルデータを読み込む

Java3Dは標準ではメタセコイアのモデルデータを読み込めない。

java3dでMetasequoiaのモデル(MQO)をロードするからmqoview20070717.zipを用いて、Java3Dからmqoファイルを取り込む方法を紹介する。

zipファイルをダウンロード後、解凍する。
jp/kurusugawa/java3d/loader/mqo下にあるMQOLoader.javaがローダーとなる。
MQOLoaderTest.javaを参考にすれば基本的にうまくいった。

Java3Dではお約束のcreateSceneGraph()内で以下のように使う。



public BranchGroup createSceneGraph() {
BranchGroup root = new BranchGroup();

try {
mObject = new MQOLoader().load(getClass().getResource(
"/myobject.mqo"));
root.addChild(createAmbientLight());
root.addChild(createDirectionalLight());
// 縮小
TransformGroup scale_group = new TransformGroup();
Transform3D scale_trans = new Transform3D();
scale_trans.setScale(0.0002);
scale_group.setTransform(scale_trans);
scale_group.addChild(mObject.getSceneGroup());
root.addChild(scale_group);
} catch (Exception e) {
e.printStackTrace();
}
root.compile();
return root;
}



scale_trans.setScale(0.0002)の値はロードするオブジェクトの大きさに合わせて調整する。
createAmbientLight()とcreateDirectionalLight()は光源の定義。
最後を参照に。

次は、SimpleUniverse。


mScene = createSceneGraph();

mUniverse = new SimpleUniverse(mCanvas);
mUniverse.getViewingPlatform().setNominalViewingTransform();
mUniverse.addBranchGraph(mScene);

// 視点
Transform3D scale_trans = new Transform3D();
scale_trans.setTranslation(new Vector3d(0d, 0d, 1.2d));
mUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(
scale_trans);

mUniverse.getViewer().getView().setBackClipDistance(1000.0);
mUniverse.getViewer().getView().setTransparencySortingPolicy(
View.TRANSPARENCY_SORT_GEOMETRY);
mUniverse.getViewer().getView().setDepthBufferFreezeTransparent(false);





public BoundingSphere mSchedulingBounds =
new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000000.0);
....
private AmbientLight createAmbientLight() {
AmbientLight tLight = new AmbientLight();
tLight.setInfluencingBounds(mSchedulingBounds);
return tLight;
}

private DirectionalLight createDirectionalLight() {
DirectionalLight tLight = new DirectionalLight(new Color3f(1.0f, 1.0f,
1.0f), new Vector3f(-1.0f, -1.0f, 0.0f));
tLight.setInfluencingBounds(mSchedulingBounds);
return tLight;
}

ラベル:

2008年5月27日火曜日

【Java】 Java3Dで背景に画像(イメージ)を設定する方法

Java3Dで背景に画像を使う方法。

Background#setImageを使う。
このメソッドはImageComponent2Dを引数に取る。
ImageComponent2DはBufferedImageを読み込むことができる。
よって、画像をBufferedImageに変換する必要がある。

1. ImageからBufferedImageへ


BufferedImage buf = new BufferedImage(image.getWidth(null), image
.getHeight(null), BufferedImage.TYPE_3BYTE_BGR);
buf.createGraphics().drawImage(image, 0, 0, null);



2. Backgroundオブジェクトに画像書き込み許可を与えて、画像をセットする。


...
mSchedulingBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
1000000.0);
...
Background mBackground = new Background();
mBackground.setApplicationBounds(mSchedulingBounds);
mBackground.setCapability(Background.ALLOW_IMAGE_WRITE);
mBackground.setImage(new ImageComponent2D(ImageComponent.FORMAT_RGB,
buf));
...
BranchGroup root = new BranchGroup();
...
root.addChild(mBackground);
...


ラベル:

【拡張現実AR】 マーカーなしで拡張現実

ARToolkitやGeorg Kleinに触発されて、拡張現実に興味を持った。特にこのデモ動画には度肝を抜かされた。Georg KleinのデモとARToolkitとの違いはマーカーを使わずに、任意の現実状況(背景)に応じてトラッキングができること。これがどういう原理で実現しているのか知りたくて論文とか書籍を参考にしながら、自分なりにマーカーなしARを作ってみた。

【AR】 マーカーなしで拡張現実 (53秒)


【AR】 マーカーなしで拡張現実2


プレビューウィンドウをマウスでドラッグしている理由は、ウィンドウを動かさないとデスクトップ録画に反映されないから。特に深い理由なし。

トラッキングの大まかな流れは、
WebCamでキャプチャ→グレースケール化→特徴抽出→対応領域探索→カメラ校正

最後のカメラ校正が今のところかなりいい加減で、奥行きの計算はされていなし回転についても処理されていない。この辺は今後の課題。

実行環境は
CPU: Core2Duo T5500 (1.66GHz)
OS: Ubuntu 7.10 Feisty
WebCam: Logitech QuickCam
Dev: Eclipse, Java3D, JMF

リアルタイムな処理がいくつか平行するので重たいが、原理が知りたかったので、とりあえずJavaで実装してみた。上記のカメラ校正がうまくいけば、C/C++で実装してみたい。

おすすめ書籍


ラベル: , , ,

2008年5月20日火曜日

【Ubuntu】 Ubuntu 8.04 HardyにJMFをインストールする。

Ubuntu 8.04 HardyにJMFをインストールする方法。

Sunからファイルをダウンロードして、インストールコマンドを実行するとエラーが帰ってくる。



Unpacking...
tail: `+309' を 読み込み用でオープンできません: No such file or directory
Extracting...
./install.sfx.7300: 1: cannot open ==: No such file
./install.sfx.7300: 1: ==: not found
./install.sfx.7300: 3: Syntax error: ")" unexpected
chmod: cannot access `JMF-2.1.1e/bin/jmstudio': No such file or directory
chmod: cannot access `JMF-2.1.1e/bin/jmfregistry': No such file or directory
chmod: cannot access `JMF-2.1.1e/bin/jmfinit': No such file or directory
jmf-2_1_1e-linux-i586.bin: 305: JMF-2.1.1e/bin/jmfinit: not found
/bin/cp: cannot stat `JMF-2.1.1e/lib/jmf.properties': No such file or directory
Done.



そこで、ダウンロードしたファイル jmf-2_1_1e-linux-i586.binを以下のように変更する。
オリジナル

tail +309 $0 > $outname



tail -n +309 $0 > $outname

ラベル: , ,

【Ubuntu】 JMF for LinuxのインストールしてWebCamを使う。

Ubuntu 7.10 FeistyにJMF for Linuxをインストールする手順。

ここからLinuxのJMFをダウンロードする。

# sh jmf-2_1_1e-linux-i586.bin

でインストール開始。

必要なライブラリをコピーする。
# sudo cp JMF-x.x.x/lib/*.jar /usr/lib/jvm/java-x-sun-x.x.x.xx/jre/lib/ext/
# sudo cp JMF-x.x.x/lib/*.so /usr/lib/jvm/java-x-sun-x.x.x.xx/jre/lib/i386/

binディレクトリ下にあるjmfstudioを起動する。
# cd bin
# ./jmfstudio

これで導入完了。

ラベル: , ,

【Ubuntu】 Ubuntu 8.04 HardyにEclipseをインストールする。

まずはJava2のツール群をインストールする。

# apt-get install java-package

次にEclipseをインストールする。

# apt-get install eclipse-sdk

日本語環境にしたいときは

# apt-get install eclipse-nls-sdk

メニューから起動する。
アプリケーション→プログラミング→Eclipse

ラベル:

【Ubuntu】 Ubuntu 8.04 Hardy上で開発するのに必須なもの

これ絶対必要。

# sudo apt-get install build-essential

ラベル:

【Ubuntu】 8.04 Hardyのアップデートがうまくいかない。

Ubuntu 8.04 Hardyをアップデートしようとするが、うまくいかない。

メニューか右上時計横の吹き出しからSynapticパッケージマネジャーを起動するがダメだ。
そこで、コマンドで試す。

# sudo apt-get update
# sudo apt-get upgrade

これでうまくいった。

ラベル:

2008年5月16日金曜日

【Ubuntu】 Java3D 1.5.1をインストール

Ubuntu 7.10 FeistyにJava3D 1.5.1をセットアップする方法。
JDKは1.6.0を使用。

ここからjava3d-1_5_1-linux-i586.binをダウンロードする。

以下のコマンドでインストールする。

# sh ./java3d-1_5_1-linux-i586.bin

ライセンスにyesと答えると、libディレクトリ作られる。
ディレクトリごとコピーする。

# sudo cp -r lib /usr/lib/jvm/java-6-sun-1.6.0.03/jre/

EclipseなどのIDEを使用している場合は、jarを手動で指定する。
Java3Dに関しては、j3dcore.jar、j3dutils.jar、vecmath.jarを指定しておけば良いだろう。

ラベル: , ,

【Java】 Java3Dのインストール:JDK1.6環境下で

Java3D 1.5のセットアップしたときのログ。
OS: Windows XP SP1
JDK: 1.6.0
Java3D: 1.5.1

ここからjava3d-1_5_1-windows-i586.exeをダウンロードする。

ダウンロードしたセットアップを実行して、インストールする。

JDKのlib/extにJava3Dのjarがコピーされる。
また、Java3Dのlib/extにもjarがある。

ラベル:

2008年5月9日金曜日

【Java】 カラー値をグレースケール値に変換する。

Javaでカラーを白黒グレースケールに変換する方法。



public static int convertToGrayScale(int rgb) {
int a = (rgb >> 24) & 0xff;
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = rgb & 0xff;
// http://ofo.jp/osakana/cgtips/grayscale.phtml
int m = (2 * r + 4 * g + b) / 7; // NTSC係数による加重平均法(近似)
return new Color(m, m, m, a).getRGB();

}



ここを参考にしました。

ラベル:

2008年5月8日木曜日

Windows XP用 Vistaメイリオフォント

マイクロソフトがVistaのメイリオフォントをWindows XP用に提供した。

以下のURLからダウンロードができる。
Japanese ClearType fonts for Windows XP

ラベル:

2008年5月2日金曜日

【Android】 Google Androidでカメラ/ライブビュー/動画取得

1. 本家インストールサイトを参考にAndroid SDKとEclipse Pluginをインストールする。

2. WebCam2000をここからダウンロードして、インストールする。

3. WebCam2000を起動して
View Preview: on
Enable Web Server: on
Live: on
Video -> Microsoft WDM Image Capture: on
http://192.168.11.5:8080で動作確認。
注意:WebCam2000が走っているマシンのIPアドレスを192.168.11.5と仮定する。localhostや127.0.0.1は使わないほうが良いらしい。

4. Javaコードの取得
Live Camera Preview in Androidから
CameraSource, GenuineCamera, HttpCamera, SocketCamera, BitmapCameraをダウンロードする。

5. Eclipseにインポートする。
Androidプロジェクトを作って、上でダウンロードしたJavaソースをインポートする。

6. Androidのサンプルプログラム CameraPreview.javaを改造
ここからCameraPreviewをダウンロードする。
run()メソッドの中身を以下に変更する。


CameraSource cs = new HttpCamera("http://192.168.11.5:8080", 320, 240, true);
cs.open();
SurfaceHolder holder = mHolder;
//Canvas canvas = new Canvas();
while(!mDone) {
Canvas canvas = holder.lockCanvas();

cs.capture(canvas); //capture the frame onto the canvas

holder.unlockCanvasAndPost(canvas);
}
cs.close();



7. 改造したプログラムを実行すると、Androidエミュレーターが起動してライブビューが現れる。

ラベル: ,

【相関くんのブログ】 4月の株価相関に対応

相関くんに4月のデータが入力されました。
日経225と(日経平均 or NASDAQ or S&P or ダウ)との相関係数を調べることができます。

ラベル: ,