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 件のコメント :
コメントを投稿