// 描画
        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];
        }