0

ビデオデータをストリームにストリーミングするために、最初のkinectプロジェクトの基本的な「hello world」アプリを試していました。コードはこちら: https://github.com/fschwiet/HelloKinect/blob/8803b6b959ee6dba5f9284b9e732fb11a897dea4/HelloKinect/ShowCameraCommand.cs

私が見つけたのは、ループ内でフレーム データをポーリングできることですが、フレーム準備完了イベントを受信して​​いません。ソースコードは以下です。UsePolling が true の場合、フレーム データがフォームに送信されます。UsePolling が false の場合、「Hit return to exit」というコンソール出力があります。すべてが実行されたことを示していますが、イベントはまったく受信されていません。

これは Windows メッセージ ポンプに関係しているように感じます。アラート可能な状態で待機するか、メッセージ キューをポンプする必要があります。私はそれを機能させることができませんでしたが、誰かヒントはありますか?

public class ShowCameraCommand : ConsoleCommand
{
    static private Form EchoForm;
    private bool UsePolling;

    public ShowCameraCommand()
    {
        this.IsCommand("show-camera");
        this.HasOption("p", "Use polling to check frame data", v => UsePolling = true);
    }

    public override int Run(string[] remainingArguments)
    {
        var sensor = KinectSensor.KinectSensors.Where(s => s.Status == KinectStatus.Connected).FirstOrDefault();

        if (sensor == null)
        {
            Console.WriteLine("Kinect was not detected");
            Console.WriteLine();
            return -1;
        }

        EchoForm = new Form();

        EchoForm.Width = 640;
        EchoForm.Height = 480;

        EchoForm.Show();

        sensor.ColorStream.Enable(ColorImageFormat.RawYuvResolution640x480Fps15);

        if (!UsePolling)
        {
            sensor.ColorFrameReady += sensor_ColorFrameReady;
        }

        sensor.Start();

        if (UsePolling)
        {
            Console.WriteLine("Use any key to exit.");
            while (!Console.KeyAvailable)
            {
                using (var frame = sensor.ColorStream.OpenNextFrame(10 * 1000))
                {
                    HandleFrame(frame);
                }

                Thread.Sleep(50);
            }
        }
        else
        {
            Console.WriteLine("Hit return to exit.");
            Console.ReadLine();
        }

        return 0;
    }

    void sensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
    {
        Console.WriteLine("Frame received");
        using (ColorImageFrame frame = e.OpenColorImageFrame())
        {
            HandleFrame(frame);
        }
    }

    private void HandleFrame(ColorImageFrame frame)
    {
        var bitmap = ImageToBitmap(frame);

        using (var g = EchoForm.CreateGraphics())
        {
            g.DrawImage(bitmap, 0, 0);
            Console.WriteLine("Frame drawn");
        }
    }

    // http://stackoverflow.com/questions/10848190/convert-kinect-colorframe-to-bitmap
    Bitmap ImageToBitmap(ColorImageFrame Image)
    {
        byte[] pixeldata = new byte[Image.PixelDataLength];
        Image.CopyPixelDataTo(pixeldata);
        Bitmap bmap = new Bitmap(Image.Width, Image.Height, PixelFormat.Format32bppRgb);
        BitmapData bmapdata = bmap.LockBits(
            new Rectangle(0, 0, Image.Width, Image.Height),
            ImageLockMode.WriteOnly,
            bmap.PixelFormat);
        IntPtr ptr = bmapdata.Scan0;
        Marshal.Copy(pixeldata, 0, ptr, Image.PixelDataLength);
        bmap.UnlockBits(bmapdata);
        return bmap;
    }
}
4

1 に答える 1

1

ああ、それを理解しました。イベントのポンピングを開始するには、 Application.Run() を呼び出す必要がありました。

于 2013-03-30T19:53:56.160 に答える