2009年2月3日火曜日

ARToolkit+WPFのサンプルらしきものを見つけた

http://www.hitlabnz.org/forum/showthread.php?t=546
http://www.brains-n-brawn.com/default.aspx?vDir=wpfaugreal

NyARToolkit with WPFの途中経過

980円で買ってきた超安物のPCカメラでもサンプルプログラムはちゃんと動いてなかなか面白かった。

自分で書いたWPFアプリケーションのコードも、PCカメラからキャプチャした動画を表示してマーカーを検出する所までは簡単にできた。

問題は、やはりマーカー座標系からカメラ座標系への変換と射影変換。

private Matrix3D NyARDoubleMatrix34ToMatrix3D(NyARDoubleMatrix34 mat)
{
return new System.Windows.Media.Media3D.Matrix3D
(mat.m00,mat.m10,mat.m20,0,
mat.m01,mat.m11,mat.m21,0,
mat.m02, mat.m12, mat.m22, 0,
mat.m03,mat.m13,mat.m23,1);
}

こういうメソッドを作っておいてViewport3D.Cameraの子要素にしたMatrixCameraオブジェクトであるMainViewport3DCameraに対して

//AR用カメラパラメタファイルをロード
m_ap = new NyARParam();
m_ap.loadARParamFromFile(Properties.Settings.Default.AR_CAMERA_FILE);
m_ap.changeScreenSize(Properties.Settings.Default.Width, Properties.Settings.Default.Height);

//投影行列をAR用カメラパラメタから設定
NyARPerspectiveProjectionMatrix ProjectionMatrix = m_ap.getPerspectiveProjectionMatrix();
MainViewport3DCamera.ProjectionMatrix = NyARDoubleMatrix34ToMatrix3D(ProjectionMatrix);

こんな感じで射影行列を設定。んでもってModelVisual3DオブジェクトであるcubeVisual3Dに対して

cubeVisual3D.Transform=new MatrixTransform3D(NyARDoubleMatrix34ToMatrix3D(result_mat));

こんな感じで変換行列を設定。

コードとしてはこんな感じで良いはずなのだが、何かを勘違いしていて動かない。

そもそも変換行列の類は意味合いがライブラリ/フレームワークでみんな異なるからなあ。でも、行列の行-列番号のアサインとかちゃんと確かめたんだけどなあ。

ARTOOLKITとNyARTOOLKIT事始め

NyARTOOLKIT For C#を使い、キャプチャはキット任せ、グラフィックはWPFの3D描画を使って何かやってみよう作戦の覚書:

NyARTOOLKITを使うので、ARTOOLKITはソースは必要なく、キャリブレーションやパターンデータファイルの作成用ツールをバイナリで入手できれば十分。なのでSourceForgeのページからARToolKit-2.72.1-bin-win32.zipをダウンロードして適当な場所に解凍しておく。

これらバイナリの使用にはGLUTが必要。Nateのページからglut-3.7.6-bin.zipをダウンロードして中身のglut32.dllをsystem32フォルダにコピー。Windows SDKをインストールしているので、せっかくだからついでにc:\program files\Microsoft SDKs\Windows\v6.1フォルダ以下のInclude\glフォルダにglut.hを、Libフォルダにglut.libをコピーしておく。

NyARTOOLKITはDirectX SDKを必要とする。ここからDirectX SDK (November 2008)をダウンロード。

NyARTOOLKITはここからNyARToolkitCS-2.1.1.zipをダウンロード。適当に解凍。DirectX SDKが導入されていれば直ちにforFW2.0\NyARToolkitCS.slnをビルド可能。せっかくなのでここにあるUma2Desktop(for Windows(.Net Framework))をダウンロード。これも直ちにビルド可能。

TODO:
1.描画をWPFにやらせたいので、NyARToolkitのCaptureTestサンプルアプリケーションを下にスケルトンを作る
2.工学ナビの記事を下にARToolkit付属のバイナリを使ってパターンファイルとキャリブレーションファイルを作ってみる。

2009年2月2日月曜日

スパム?

アクセス解析を見ていると定期的に
http://www.blogger.com/navbar.g?targetBlogID=ほにゃららほにゃらら
こんな感じの参照元からのアクセスのバーストがある。何だろうこれ。スパムにしては効率悪いよなあ。

と思っていたら今日モノホンのコメントスパムが。Cheap Air Jordan 、Nike Dunk and Silver Tiffanyがどーたらこーたら。容赦なく削除した。blogspotってcaptcha通らないとコメントできなかったよなあ。こうしてまたひとつ、スパムボットが知性認定を受けたのであった。

#captchaってのは本来、高度な人工知能は知性を持つと言えるのか、との問いに対し、「ある種のテストをパスするのならば実際上区別しようがなくなるので知性があると認めるしかないだろう」と、確かチューリングが提案した概念。すなわちその満たすべき性質とは、(1)人間は必ずパスできる(2)ショボイ人工知能にはパスできない、である。だからcaptchaが破られるのは人工知能の性能向上という喜ばしい事態だし、人間ですらパスするのが容易でないテストを作ってスパム耐性を高めるというのは本来の意味のcaptchaとしては本末転倒なのだ。俺、最近しょっちゅうcaptchaに弾かれるのだが、本当に人間なのか不安になるぞ。
#で、「んなこと言ったって機械は機械だよ。知性だなんて認めたくないよやだやだ」と駄々をこねたのがいわゆる中国人の部屋のパラドックス。パラドックスというより、アンドロイド差別宣言だね。

し、しどい・・・


金曜日にロングポジションが完璧に失敗して12000円の追証が発生。でもどう考えても平均線からの強い反発なので今日の下げで追証解消できるだろうと7980でドテンショートした。

で、今日の動き。何だよこれ。9時30分くらいに7800を割ったタイミングで返済すれば余裕で首はつながった。でも、一度返済してしまうと大引けまで資金が拘束されるので前場引けかせめて10時半まで引っ張る事に決めていたのでそのまま放置していたらひたすら強い上げ相場に。今日上げる意味がさっぱり分からない。これ絶対後場で前場安値の7790を割ってダダ下げの展開になるよ。ムキー。

まあ、現在の健康状態ではデイトレはどうにも負担になりすぎるので、手を引く良い機会になったということで。

製作者がこの体たらくでは「身も蓋もない」の説得力も何もあったものじゃないわけですが、まあ皆さん私を反面教師にして、欲を出してオーバーナイトなんてせずにデイトレに徹して、「身も蓋もない」を活用してください。こういう展開になった以上ちょっとずるい引用の仕方だけど、「身も蓋もない」をデイトレに本格的に活用した三週間の記録はこちらにあります。

本当に、スイングスタイルに切り替えた途端に外しまくって一週間で一気に損が膨らんだのには肝が冷えた。レバレッジの大きさを全然理解していなかった。しかしデイトレに限ればならば225先物は実に魅力的な投資対象になり得る。いつか機会があったらまた参戦したいな。誰か種になるくらいの量の寄付をアドインに対してしてくれないかなあ。

というわけでタイジョー。ちゃんちゃん。

2009年2月1日日曜日

はっちゅう君プラスのアドインライブラリのAddInFormの使い方(改)

何度か取り上げたAddInFormの拡張の仕方。はっちゅう君プラス本体を最小化した時にフロートウィンドウに対するドックインジケータが表示されるというのは勘違いだった。よって、(1)フロート時に最前面に表示する(2)フロートウィンドウが起動時に復元された時サイズも正しく復元する、の二点のみを解決すれば良い。コードはこんな感じ。

public class ほにゃらら : AddInForm
{
#region メソッド
private void setIndependentWindowOrDependentWindow()
{
if (this.DockState == DockState.Float) {
this.TopMost = true;
this.TopLevel = true;
} else {
this.TopMost = false;
this.TopLevel = false;
}
}
#endregion

#region カスタムしたメソッド
protected override string GetPersistString()
{
//インスタンス毎に保持する設定を永続化文字列に", "に続けて繋げて返す。
return base.GetPersistString() + ", " + ほにゃらら;
}
protected override void OnDockStateChanged(EventArgs e)
{
setIndependentWindowOrDependentWindow();
base.OnDockStateChanged(e);
}
protected override void OnSizeChanged(EventArgs e)
{
if (this.DockState == DockState.Float) {
this.ClientSize = this.ClientSize;
}
base.OnSizeChanged(e);
}
protected override void OnLoad(EventArgs e)
{
setIndependentWindowOrDependentWindow();
base.OnLoad(e);
}
#endregion
}

ただ、起動時に復元されたフローティングフォームの最前面表示の設定(TopMost=true)が有効にならない問題は未だ解決せず。まあ、ビルトインの注文フォーム(フロート)でも同じ問題があるし、ここまでやれば御の字だろう。


追記:上記問題は、setIndependentWindowOrDependentWindowメソッドを

private void setIndependentWindowOrDependentWindow()
{
if (this.DockState == DockState.Float) {
this.TopMost = true;
this.TopLevel = true;
} else {
this.TopMost = true;//ポイント!
this.TopLevel = false;
}
}

と変更すると解決するようだ。どうやら、はっちゅう君プラスの起動時にフォームが復元される時、DockStateがDockState.Floatにセットされていないのが問題のようだが、ドッキングフォームの場合TopMostプロパティに意味はないので、フロート状態であるか否かに関わらずTopMostプロパティをtrueにしてやれば良いという事らしい。

最近の体調

最近、朝6時くらいには目が覚めてしまって、それから1~2時間、思考力・集中力の阻害される症状が和らぐ時間帯がある。その代わりこの時間帯は筋肉痛がひどく、耐え難い。