3

KinectのビデオストリームをPictureBoxに表示しようとしています。その理由は、いくつかの画像をオーバーレイし、FillEllipse()メソッドを使用してリアルタイムマーカーを追加したいからです。しかし、赤いx(十字)が入ったボックスになってしまいました。誰かが私に見せてもらえますか、私はどこで失敗しましたか?代わりにWritableBitmapを使用する必要がありますか?私はこれについて考えましたが、書き込み可能なビットマップは、マーカーを配置するためのFillEllipse()などのメソッドを提供していません。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.Kinect;
using System.Drawing.Imaging;
using System.Drawing;
using System.Runtime.InteropServices;

namespace fTrack_WF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        KinectSensor myKinect;

        private void Window_Loaded(object sender, EventArgs e)
        {
            if (KinectSensor.KinectSensors.Count == 0)
            {
                MessageBox.Show("No Kinects device detected", "Camera View");
                Application.Exit();
                return;
            }

            try
            {
                // get first Kinect device attached on computer
                myKinect = KinectSensor.KinectSensors[0];

                // enable depth stream
                myKinect.DepthStream.Enable();

                // enable color video stream
                myKinect.ColorStream.Enable();

                // start the sensor
                myKinect.Start();


                // connect up the video event handler
                myKinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(myKinect_ColorFrameReady);

            }
            catch
            {
                MessageBox.Show("Kinect initialise failed", "Camera viewer");
                Application.Exit();
            }


        }


        #region Video Image Processing

        byte[] colorData = null;
        Bitmap kinectVideoBitmap = null;
        IntPtr colorPtr;

        void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
            {
                if (colorFrame == null) return;

                if (colorData == null)
                    colorData = new byte[colorFrame.PixelDataLength];

                colorFrame.CopyPixelDataTo(colorData);

                Marshal.FreeHGlobal(colorPtr);
                colorPtr = Marshal.AllocHGlobal(colorData.Length);
                Marshal.Copy(colorData, 0, colorPtr, colorData.Length);

                kinectVideoBitmap = new Bitmap(
                    colorFrame.Width,
                    colorFrame.Height,
                    colorFrame.Width * colorFrame.BytesPerPixel;
                    PixelFormat.Format32bppRgb,
                    colorPtr);

                kinectVideoBox.Image = kinectVideoBitmap;

                kinectVideoBitmap.Dispose();

            }

        }

        #endregion
    }
}

どうもありがとうございます!

よろしく、イケル

4

2 に答える 2

3

私は答えを見つけました。ここに示されているように、リソースを解放するには廃棄が必要です。問題は、描いた後の廃棄が早すぎたため、何も描かれていないように見えたということです。しかし、とにかく、私にとってより明確な答えがここに与えられました。

BitmapImageを実装するから継承するIDisposableため、インスタンスの使用が終了したら、インスタンスを呼び出す必要がありますDispose()。これにより、Imageの管理されていないリソースがクリーンアップされます。

ただし、Image も実装してfinalizerいるため、何らかの理由で呼び出すことができない場合Dispose()は、インスタンスのファイナライズ中にリソースが再利用されます。これは、インスタンスが参照されなくなった後のある時点で発生します。

削除kinectVideoBitmap.Dispose();しただけで、WindowsフォームにKinectのビデオストリームがPictureBoxコントロール内に表示されます。

よろしく、イケル

于 2012-10-01T06:22:00.737 に答える
2

WPFだけでなくWinFormsPictureBoxを使用している理由がわかりません。

ビデオストリームの上にCanvasを配置して、SDKの例で示し、単純にそれに引き付けてみましたか?

    <Grid HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="320" Height="240">
        <lt:KinectDepthViewer x:Name="DepthViewer" KinectSensorManager="{Binding KinectSensorManager}" />
        <Canvas>
            <lt:KinectSkeletonViewer
                                KinectSensorManager="{Binding KinectSensorManager}"
                                Width="{Binding ElementName=DepthViewer, Path=ActualWidth}"
                                Height="{Binding ElementName=DepthViewer, Path=ActualHeight}"
                                ShowBones="True" ShowJoints="True" ShowCenter="True" ImageType="Depth" />
        </Canvas>
    </Grid>


    <Canvas Name="DrawingCanvas">
    </Canvas>

2番目のキャンバスはより高いz-indexにあり、その上のオブジェクトはビデオストリームを覆います。

PS私のコードはデプスビューアを指していますが、SDKの例を使用する場合、ビデオストリームは同じ方法で実行されます。

于 2012-09-26T21:38:04.490 に答える