Attualmente sto lavorando con AForge e ho un nuovo evento frame che inserisce il frame, come bitmap, in una picturebox. Il 90% delle volte funziona alla grande ... A MENO CHE non mangio qualcosa sulla winform. Modifica di una casella combinata, spostando la finestra, o qualcosa di simile rischia di causare il Picturebox per passare dal video per un grande campione di rosso X. Code di seguito:Picturebox diventa rosso grande X ma non riesco a rilevarlo o correggerlo
private void connectButton_Click(object sender, EventArgs e)
{
try
{
cam = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
cam.NewFrame -= Handle_New_Frame; //Just to avoid the possibility of a second event handler being put on
cam.NewFrame += new AForge.Video.NewFrameEventHandler(Handle_New_Frame);
cam.Start();
}
catch
{
MessageBox.Show("An error has occured with connecting to the specified webcam. The application will now close!");
Application.Exit();
}
}
private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
{
try
{
if (bitmap != null)
bitmap.Dispose(); //Without this, memory goes nuts
bitmap = new Bitmap(eventArgs.Frame);
}
catch { }
//Draw some stuff on the images
bitmap = AdjustBrightness(bitmap, brightnessMeter);
bitmap = ApplyContrast(contrastMeter, bitmap);
bitmap = Draw_Top_Line(bitmap);
bitmap = Draw_Bottom_Line(bitmap);
//Set the image into the picturebox
this.Invoke((MethodInvoker)delegate
{
videoPictureBox1.Image = bitmap;
frameRate++; //Keep track of the frame rate
});
GC.Collect(); //Without this, memory goes nuts
this.Invoke((MethodInvoker)delegate {
videoPictureBox1.Refresh(); //NOT NECESSARY. JUST TRYING TO FIX THE BIG RED X!
});
if (videoPictureBox1.Image == videoPictureBox1.ErrorImage)
{
cam.Stop(); //ALSO NOT NECESSARY> AGAIN, JUST TRYING TO FIX THE BIG RED X!
cam.Start();
}
}
ho messo una pausa sul se (videoPictureBox1.Image == videoPictureBox1.ErrorImage) e sta valutando false, anche quando la grande X rossa è attiva, perché l'immagine viene effettivamente impostata sulla bitmap. Quindi cam.Stop() e cam.Start() non hanno mai funzionato (non sono sicuro se ciò sarebbe di aiuto, ma ho pensato di fare un tentativo).
videoPictureBox1.Refresh() è in esecuzione ogni volta, ma ancora una volta- non fa la differenza. Ancora il grande rosso X.
Come ho detto prima: se avvio il video e non tocco nulla, la grande X rossa non accadrà mai. Ma nel momento in cui comincio a cambiare le caselle combinate, o trascinando il modulo stesso in giro, le possibilità della grande X rossa aumentano esponenzialmente. A volte riesco a sfogliare la casella combinata 10-12 volte prima che accada, altre volte succede il secondo quando clicco sulla casella combinata. : - \
Qualcuno può spiegare cosa sta succedendo qui e forse offrire un suggerimento sul metodo migliore per risolvere il problema? Sono ancora molto nuovo al threading, quindi mi sono sforzato di capire esattamente cosa sta succedendo qui e il modo migliore per risolvere il problema! Qualsiasi suggerimento nella giusta direzione sarebbe di grande aiuto!
Penso che probabilmente non userò una scatola di immagini. Usa invece un pannello e disegna la bitmap nell'evento paint del pannello. Forzare un aggiornamento con invalidare. –
Hai visto l'eventArgs.Frame durante il grande X senario rosso? Inoltre metterei una messagebox sotto quell'eccezione nel caso in cui è dove si verifica l'errore. – TheKingDave
Va bene, ti darò una prova davvero veloce! Un'ulteriore nota: sono andato a eseguire il debug -> eccezioni e ho controllato tutte le caselle di controllo "generate". Nulla getta quando ciò accade. Affatto. –