Перезапуск Camera.StartStreamingBitmaps после Camera.PictureCaptured
У меня есть приложение камеры.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 вместо того, чтобы каждый раз создавать новое растровое изображение.)
В чем дело? Как следует остановить потоковую передачу камеры для захвата и изображения, а затем возобновить потоковую передачу?
2 ответа
Это звучит почти как 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
подпрограммы в других обработчиках событий, пока вы не обнаружите, какая из них действительно вызывает проблему.
Попробуйте удалить обратный вызов при прекращении потоковой передачи растровых изображений:
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));
}