我有一个.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,我会得到同样的异常。)
发生了什么事?应该如何停止相机流式传输以捕获和成像然后重新启动它?
答案 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));
}