我目前正在使用AForge,並有一個新的幀事件,將幀作爲位圖發佈到picturebox中。 90%的工作時間很棒......除非我在winform上撥弄一些東西。更改組合框,移動窗口,或類似的東西的風險導致在PictureBox從視頻切換到下面一個大紅色的X代碼示例:Picturebox變得大紅X但我無法檢測或修復它
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();
}
}
我把休息的,如果(videoPictureBox1.Image == videoPictureBox1.ErrorImage),並且它正在計算爲false,即使當大紅色X啓動時,因爲圖像實際上被設置爲位圖。所以cam.Stop()和cam.Start()永遠不會運行(不知道這是否會幫助,但我想我會試試看)。
videoPictureBox1.Refresh()每次都在運行,但再次 - 它沒有區別。仍然有大紅色的X.
正如我之前所說:如果我開始播放視頻並且什麼都不碰,大紅色的X將永遠不會發生。但是,當我開始更換組合框,或拖動表單本身時,大紅色X的機會呈指數級增長。有時候我可以在組合框中翻轉10到12次,其他時候我會點擊組合框。 : - \
任何人都可以解釋這裏發生了什麼,也許提供了一個建議最好的方法來解決它?我對線程仍然很陌生,所以我一直在努力將自己的頭腦圍繞到這裏發生的事情以及解決問題的最佳方式!任何向正確的方向推動將是一個巨大的幫助!
我想我可能只是沒有使用圖片框。改爲使用面板並在面板的繪製事件中繪製位圖。用invalidate強制刷新。 –
在大紅色的XSenario期間,你看過eventArgs.Frame嗎?此外,我會將該消息框放在該異常下,以防發生錯誤。 – TheKingDave
好的,我會盡快給你一個嘗試! 附加的註釋:我去調試 - >異常,並檢查所有的「時拋出」複選框。發生這種情況時什麼也不拋出。完全一樣。 –