在Camera.PictureCaptured之后重新启动Camera.StartStreamingBitmaps

时间:2013-01-23 08:21:30

标签: .net-micro-framework .net-gadgeteer

我有一个.Net Gadgeteer相机应用程序,可将位图从相机流式传输到屏幕。按下按钮,它会停止从相机中流式传输位图,拍摄照片,将其写入SD卡,然后重新开始流式传输。这是代码的简化版本(没有保存到SD卡的东西):

using Microsoft.SPOT;
using GT = Gadgeteer;
using Gadgeteer.Modules.GHIElectronics;
namespace SimpleStopStreamingApp
{
    public partial class Program
    {
        void ProgramStarted()
        {
            camera.CameraConnected += new Camera.CameraConnectedEventHandler(camera_CameraConnected);
            camera.BitmapStreamed += new Camera.BitmapStreamedEventHandler(camera_BitmapStreamed);
            camera.PictureCaptured += new Camera.PictureCapturedEventHandler(camera_PictureCaptured);
            button.ButtonPressed += new Button.ButtonEventHandler(button_ButtonPressed);
        }
        void camera_CameraConnected(Camera sender)
        {
            camera.StartStreamingBitmaps(new Bitmap(camera.CurrentPictureResolution.Width, camera.CurrentPictureResolution.Height));
        }
        void camera_BitmapStreamed(Camera sender, Bitmap bitmap)
        {
            display_T35.SimpleGraphics.DisplayImage(bitmap, 0, 0);
        }
        void button_ButtonPressed(Button sender, Button.ButtonState state)
        {
            camera.StopStreamingBitmaps();
            camera.TakePicture();
        }
        void camera_PictureCaptured(Camera sender, GT.Picture picture)
        {
            camera.StartStreamingBitmaps(new Bitmap(camera.CurrentPictureResolution.Width, camera.CurrentPictureResolution.Height));
        }
    }
}

但是,当我尝试重新启动流式传输时(在PictureCaptured事件处理程序中),我得到了异常。

#### Exception System.Exception - 0xffffffff (1) ####
#### Message: 
#### GHI.Premium.USBHost.USBH_Webcam::StartStreaming_Internal [IP: 0000] ####
#### GHI.Premium.USBHost.USBH_Webcam::StartStreaming [IP: 0005] ####
#### Gadgeteer.Modules.GHIElectronics.Camera::StartStreamingBitmaps [IP: 007e] ####
#### Gadgeteer.Modules.GHIElectronics.Camera::OnPictureCapturedEvent [IP: 0037] ####
#### System.Reflection.MethodBase::Invoke [IP: 0000] ####
#### Gadgeteer.Program::DoOperation [IP: 001a] ####
#### Microsoft.SPOT.Dispatcher::PushFrameImpl [IP: 0054] ####
#### Microsoft.SPOT.Dispatcher::PushFrame [IP: 001a] ####
#### Microsoft.SPOT.Dispatcher::Run [IP: 0006] ####
#### Gadgeteer.Program::Run [IP: 0020] ####

A first chance exception of type 'System.Exception' occurred in GHI.Premium.USBHost.dll Error invoking method "Gadgeteer.Modules.GHIElectronics.Camera" (check arguments to Program.BeginInvoke are correct)

(N.B。如果我将位图存储为实例变量并将其传递给两次调用StartStreamingBitmaps而不是每次都创建一个新的Bitmap,我会得到同样的异常。)

发生了什么事?应该如何停止相机流式传输以捕获和成像然后重新启动它?

2 个答案:

答案 0 :(得分:1)

几乎听起来StartStreamingBitmaps预计会在一个主题上运行(通过check arguments to Program.BeginInvoke are correct的注释)。

看着这个:

void camera_PictureCaptured(Camera sender, GT.Picture picture)
{
  camera.StartStreamingBitmaps(new Bitmap(camera.CurrentPictureResolution.Width, camera.CurrentPictureResolution.Height));
}

我对此 Gadgeteer 模块一无所知,但如果您正确连接,我认为您的新GT.Picture已包含在picture中传入的参数。

在相机拍完照片之后,您似乎试图从相机中流式传输图像

你能编辑你的帖子并提供更多细节吗?你可以验证这个camera_PictureCaptured事件是你的异常被抛出的地方吗?通过将事件处理程序修改为:

,这很容易
void camera_PictureCaptured(Camera sender, GT.Picture picture)
{
  try
  {
    camera.StartStreamingBitmaps(new Bitmap(camera.CurrentPictureResolution.Width, camera.CurrentPictureResolution.Height));
  } catch (Exception err)
  {
    throw new Exception("PictureCaptured: " + err.Message);
  }
}

如果此事件处理程序不是抛出异常的处理程序,请尝试在您的其他事件处理程序中放置类似的try...catch例程,直到您发现哪一个真正导致问题。

答案 1 :(得分:0)

尝试在停止流式传输位图时删除回调:

void button_ButtonPressed(Button sender, Button.ButtonState state)
{
    camera.BitmapStreamed -= new Camera.BitmapStreamedEventHandler(camera_BitmapStreamed);
    camera.StopStreamingBitmaps();
    camera.TakePicture();
}

void camera_PictureCaptured(Camera sender, GT.Picture picture)
{
    camera.BitmapStreamed += new Camera.BitmapStreamedEventHandler(camera_BitmapStreamed);
    camera.StartStreamingBitmaps(new Bitmap(camera.CurrentPictureResolution.Width, camera.CurrentPictureResolution.Height));
}