スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

拡張現実子供乗せロボットゲーム製作(第三回)


ソフトウエア編

今回使用するものは
・XBOX360USBパッド
・XNA(XBOX360、Windows用)
・OPENCV(SharperCV)(画像認識ライブラリ)
・USB-IO制御DLL

まずはXNA上でUSB-IOの制御を行います
下記でUSB-IO制御DLLをC#から
コールできるようなコードを提供してくれているので
そちらをプロジェクトに組み込みます

やねうらおさんの日記
http://d.hatena.ne.jp/yaneurao/20041109

起動時にUSB-IOの検索を行うコードを追加します

protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent)
{
USBIO.USBIO.uio_find();
}
}

終了時にUSB-IOの解放を行うコードを追加します

protected override void UnloadGraphicsContent(bool unloadAllContent)
{
if (unloadAllContent == true)
{
USBIO.USBIO.uio_free();
}
}


XBOX360USBパッドとキーボードから
操作された際にUSB-IOにビットを送信してあげます


KeyboardState keys = Keyboard.GetState();
GamePadState currentState = GamePad.GetState(PlayerIndex.One);
if ((keys.IsKeyDown(Keys.A) && keys.IsKeyDown(Keys.W))
|| (currentState.ThumbSticks.Left.X < -0.5f && currentState.ThumbSticks.Left.Y > 0.5f))
{
USBIO.USBIO.uio_out(1, 1 + 4, 0);
}
else if ((keys.IsKeyDown(Keys.D) && keys.IsKeyDown(Keys.W))
|| (currentState.ThumbSticks.Left.X > 0.5f && currentState.ThumbSticks.Left.Y > 0.5f))
{
USBIO.USBIO.uio_out(1, 2 + 8, 0);
}
if (keys.IsKeyDown(Keys.A) || currentState.ThumbSticks.Left.X < -0.5f)
{
USBIO.USBIO.uio_out(1, 1 + 4 + 8, 0);
}
else if (keys.IsKeyDown(Keys.D) || currentState.ThumbSticks.Left.X > 0.5f)
{
USBIO.USBIO.uio_out(1, 2 + 4 + 8, 0);
}
else if (keys.IsKeyDown(Keys.W)
|| currentState.ThumbSticks.Left.Y > 0.1f)
{
USBIO.USBIO.uio_out(1, 12, 0);
}
//後
else if (keys.IsKeyDown(Keys.S) || currentState.ThumbSticks.Left.Y < -0.1f)
{
USBIO.USBIO.uio_out(1, 0, 0);
}
//STOP
else
{
USBIO.USBIO.uio_out(1, 15, 0);
}


次にUSBカメラの画像をフルスクリーンで表示するために
XNAで描画するようにします
(普通の描画では遅いため、GPUをつかってやる)
カメラからの画像取得はOPENCVのC#版を使います
http://chihara.naist.jp/opencv/?SharperCV

USBカメラの画像を取得

theFrame = theSrc.QueryFrame();


それにはOPENCVで使われている画像形式を
XNAのTexture2Dに変換する必要があります
これが結構大変でした

取得した画像をBitmap形式に変換

System.Drawing.Bitmap bm = new System.Drawing.Bitmap(theFrame.Size.width,
theFrame.Size.height, theFrame.Size.width * 3,
System.Drawing.Imaging.PixelFormat.Format24bppRgb,
theFrame.getPixelAddr(0, 0, 0));

それをBitmapDataに分解

uint[] data = new uint[bm.Width * bm.Height];
System.Drawing.Imaging.BitmapData b = bm.LockBits(new System.Drawing.Rectangle(0, 0, bm.Width, bm.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
uint* ptr = (uint*)b.Scan0.ToPointer();

分解したデータをバイト配列に変換

for (int x = 0; x < bm.Width; x++)
for (int y = 0; y < bm.Height; y++)
{
data[x + y * bm.Width] = ptr[x + y * bm.Width];
}

bm.UnlockBits(b);
Texture2D texture = new Texture2D(graphics.GraphicsDevice, bm.Width, bm.Height, 0,
ResourceUsage.None, SurfaceFormat.Color);

バイト配列をテクスチャーに設定

texture.SetData(data);


後はこのテクスチャーを全画面で描画するだけです
無駄が有りそうですが、とりあえず表示できるので
OKとしましょう

次は拡張現実部分です
かっこよく言うとオーギュメンテッド・リアリティ
スポンサーサイト

テーマ : ハードウェア - ジャンル : コンピュータ

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

BitmapからTexture2Dへの変換方法

 初めましてTexture2DからBitmapへの良さそうな変換方法を探しているうちに、こちらへ辿り着きました。
 ところでもう既にご存知かもしれませんが、BitmapからTexture2Dへの変換方法の一つとしてMemoryStreamを使う方法がありますよ。

Texture2D texture;

System.Drawing.Bitmap bm = new System.Drawing.Bitmap(theFrame.Size.width, theFrame.Size.height, theFrame.Size.width * 3, System.Drawing.Imaging.PixelFormat.Format24bppRgb, theFrame.getPixelAddr(0, 0, 0));

using (System.IO.MemoryStream ms = new MemoryStream(bm.Width * bm.Height))
{
bm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
ms.Position = 0;
texture = Texture2D.FromFile(graphics.GraphicsDevice, ms);
ms.Close();
}

 どっかの英語のフォーラムで見つけたもので、自分でも、「いや、コレ処理速度という点でどうなの? というか無駄な変換があるんでない?」と納得いかない点はあるのですが、とにかくやっている事が単純明快でコードが短いから、これ使ってます。

Re: BitmapからTexture2Dへの変換方法

私のやった方法は明らかに無駄がありましたから
処理速度が命のプログラムですし
MemoryStreamを使う方法参考にさせてもらいますね

>  初めましてTexture2DからBitmapへの良さそうな変換方法を探しているうちに、こちらへ辿り着きました。
>  ところでもう既にご存知かもしれませんが、BitmapからTexture2Dへの変換方法の一つとしてMemoryStreamを使う方法がありますよ。
>
> Texture2D texture;
>
> System.Drawing.Bitmap bm = new System.Drawing.Bitmap(theFrame.Size.width, theFrame.Size.height, theFrame.Size.width * 3, System.Drawing.Imaging.PixelFormat.Format24bppRgb, theFrame.getPixelAddr(0, 0, 0));
>
> using (System.IO.MemoryStream ms = new MemoryStream(bm.Width * bm.Height))
> {
> bm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
> ms.Position = 0;
> texture = Texture2D.FromFile(graphics.GraphicsDevice, ms);
> ms.Close();
> }
>
>  どっかの英語のフォーラムで見つけたもので、自分でも、「いや、コレ処理速度という点でどうなの? というか無駄な変換があるんでない?」と納得いかない点はあるのですが、とにかくやっている事が単純明快でコードが短いから、これ使ってます。

コメントの投稿

管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

プロフィール

TEA(てぃあ)

Author:TEA(てぃあ)
親サイト:
フリーのゲームがダウンロードできます
主にシューティング系

最新記事
最新コメント
カテゴリ
PSP Vita
カウンター
ジャスティスレギオン 無料ダウンロード
インディーズPSPVitaゲーム
リンクや作った物
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。