2

カメラから画面にビットマップをストリーミングする .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)

(注: ビットマップをインスタンス変数として格納し、毎回新しいビットマップを作成する代わりに、StartStreamingBitmaps への両方の呼び出しに渡すと、この同じ例外が発生します。)

どうしたの?カメラのストリーミングを停止してキャプチャと画像を取得し、ストリーミングを再開するにはどうすればよいですか?

4

2 に答える 2

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モジュールについては何も知りませんが、正しく配線されていれば、渡されたパラメーターに newGT.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、どのイベント ハンドラーが実際に問題を引き起こしているかがわかるまで、他のイベント ハンドラーに同様のルーチンを配置してみてください。

于 2013-01-24T14:20:18.497 に答える
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));
}
于 2013-06-12T21:11:03.240 に答える