// 描画 private unsafe void xnDraw() { // ノードの更新を待ち、データを取得する context.WaitAndUpdateAll(); ImageMetaData imageMD = image.GetMetaData(); DepthMetaData depthMD = depth.GetMetaData(); CalcHist(depthMD); // カメラ画像の作成 lock (this) { // 書き込み用のビットマップデータを作成 Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); BitmapData data = bitmap.LockBits(rect, ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); // 生データへのポインタを取得 byte * dst = (byte *)data.Scan0.ToPointer(); byte * src = (byte *)image.ImageMapPtr.ToPointer(); ushort *dep = (ushort *)depth.DepthMapPtr.ToPointer(); for (int i = 0; i < imageMD.DataSize; i += 3, src += 3, dst += 3, ++dep) { byte pixel = (byte)histogram[*dep]; // ヒストグラムの対象外の場合、カメライメージを描画する if (pixel == 0) { dst[0] = src[2]; dst[1] = src[1]; dst[2] = src[0]; } // それ以外の場所はヒストラムを描画する else { dst[0] = 0; dst[1] = pixel; dst[2] = pixel; } } bitmap.UnlockBits(data); // 現在の状態を表示する Graphics g = Graphics.FromImage(bitmap); string message = ""; message += "ImageMirror:" + mirrorState[image.ToString()] + "\n"; message += "DepthMirror:" + mirrorState[depth.ToString()]; g.DrawString(message, font, brush, point); } }
// 初期化 private void xnInitialize() { // コンテキストの初期化 ScriptNode scriptNode; context = Context.CreateFromXmlFile(CONFIG_XML_PATH, out scriptNode); // イメージジェネレータの作成 image = context.FindExistingNode(NodeType.Image) as ImageGenerator; if (image == null) { throw new Exception(context.GlobalErrorState); } // デプスジェネレータの作成 depth = context.FindExistingNode(NodeType.Depth) as DepthGenerator; if (depth == null) { throw new Exception(context.GlobalErrorState); } // デプスの座標をイメージに合わせる depth.AlternativeViewpointCapability.SetViewpoint(image); // カメラ画像の // ミラー状態が変更されたことを通知するコールバックを登録 // ミラー状態の取得 OpenNI.MirrorCapability imageMirror = image.MirrorCapability; imageMirror.MirrorChangedEvent += new EventHandler(Form1_MirrorChangedEvent); mirrorState.Add(image.ToString(), imageMirror.IsMirrored()); // デプスの // ミラー状態が変更されたことを通知するコールバックを登録 // ミラー状態の取得 OpenNI.MirrorCapability depthMirror = depth.MirrorCapability; depthMirror.MirrorChangedEvent += new EventHandler(Form1_MirrorChangedEvent); mirrorState.Add(depth.ToString(), depthMirror.IsMirrored()); // ヒストグラムバッファの作成 histogram = new int[depth.DeviceMaxDepth]; }