[C#][XNA][AR]MikuMikuDance for XNAを使用してARを行う(3)


7.Game1.csの編集を行い実装を行っています。
(1)GoblinXNAを使いWebカメラからの映像の取り込み、マーカーの位置取得を行うコードを実装します。
■以下のように名前空間を追加します。

//GoblinXNA -> AR処理に使用
using System.Runtime.InteropServices;
using GoblinXNA.Device.Capture;
using GoblinXNA.Device.Vision;
using GoblinXNA.Device.Vision.Marker;

■Webカメラからの取り込み、ARマーカーのトラッキング用のメンバ変数を追加します。

//ビデオキャプチャデバイス
IVideoCapture m_captureDevice = null;
//キャプチャ画像保存バッファ
IntPtr m_pbufferedVideoPointers = IntPtr.Zero;
int[] m_nbufferedVideoPointers;
//キャプチャバッファ描画用クラス
Texture2D frame;
//ARトラッカー
ALVARMarkerTracker tracker;
object markerID;

■Webカメラの初期化用のコードを以下のように追加します。

//カメラの設定]
private void SetupMarkerTracking()
{
if (m_captureDevice == null)
{
//ビデオキャプチャーデバイスのインスタンスを初期化する
m_captureDevice = new DirectShowCapture();
m_captureDevice.InitVideoCapture(0, FrameRate._60Hz, Resolution._640x480, ImageFormat.R8G8B8_24, false);
int imageSize = 640 * 480 * 3;
m_pbufferedVideoPointers = Marshal.AllocHGlobal(imageSize);
m_nbufferedVideoPointers = new int[640 * 480];
}
//ALVARオブジェクトを作成する
tracker = new ALVARMarkerTracker();
tracker.MaxMarkerError = 0.02f;
tracker.InitTracker(m_captureDevice.Width, m_captureDevice.Height, "default_calib.xml", 32.4f);
markerID = tracker.AssociateMarker("ARDominoALVAR.txt");
tracker.EnableTracking = true;
}

■SetupMarkerTrackingをInitializeで呼び出しカメラを初期化します。

protected override void Initialize()
{
// TODO: ここに初期化ロジックを追加します。
base.Initialize();
//カメラの初期化を行う
SetupMarkerTracking();
}

■Updateにキャプチャ処理ARマーカー追跡処理を追加します。

protected override void Update(GameTime gameTime)
{
<省略>
//////////////////////////////////////////////////////////////////
//キャプチャーから画像を取得する
m_captureDevice.GetImageTexture(m_nbufferedVideoPointers, ref m_pbufferedVideoPointers);
//バッファのデータを解放する(解放しないと描画できない)
if (frame.GraphicsDevice.Textures[0] == frame)
frame.GraphicsDevice.Textures[0] = null;
//バッファにキャプチャしたデータを書き込む
frame.SetData<int>(m_nbufferedVideoPointers);
//ARマーカー追跡処理
tracker.ProcessImage(m_captureDevice, m_pbufferedVideoPointers);
<省略>
}

■キャプチャしたデータを背景画像として描画時に書き込みます。

protected override void Draw(GameTime gameTime)
{
<省略>
//ウインドウに描画する
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.Opaque);
spriteBatch.Draw(frame, new Rectangle(0, 0, 800, 600), Color.White);
spriteBatch.End();
<省略>
}

■解放時の処理を追加します。

protected override void Dispose(bool disposing)
{
//バッファを解放する
if (m_pbufferedVideoPointers != IntPtr.Zero)
{
Marshal.FreeHGlobal(m_pbufferedVideoPointers);
}
//基底クラスの処理
base.Dispose(disposing);
}


0 件のコメント :

コメントを投稿