2013-03-30 2 views
0

첫 번째 kinect 프로젝트에서 비디오 데이터를 스트림으로 스트리밍하기위한 기본적인 "hello world"앱을 사용하려고했습니다. 코드는 다음과 같습니다. https://github.com/fschwiet/HelloKinect/blob/8803b6b959ee6dba5f9284b9e732fb11a897dea4/HelloKinect/ShowCameraCommand.cskinect - 프레임 데이터를 폴링 할 수 있지만 이벤트가 작동하지 않습니다.

루프에서 프레임 데이터를 폴링 할 수 있지만 프레임 준비 이벤트가 수신되지 않습니다. 소스 코드는 아래에 있습니다. 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; 
    } 
} 

답변

1

아, 알아 냈어. 이벤트 펌핑을 시작하려면 Application.Run()을 호출해야했습니다.