在上一篇裡,EmguCV(OpenCV)實作高效顯示漢字及疊加 實作了視訊疊加及顯示,但存在問題,就是
Emgu.CV.UI.ImageBox及C# picturebox顯示圖檔時都會出現閃爍,尤其是圖檔的下方部分。
初步懷疑是電腦處理不過來,i3-3220 3.3Ghz 在1080p下cpu占用30%左右,480p下占用10%左右。480p下無閃爍現象。
一次把視訊顯示視窗調小,觀察很久未出現閃爍現象,于是懷疑是C# picturebox控件問題,Emgu.CV.UI.ImageBox也繼承了C# picturebox控件。
百度了一下 C# picturebox 閃爍 這些關鍵詞,發現很多相同問題。
大部分是要采用雙緩沖
this.DoubleBuffered = true;
或者複雜點
this.SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.Opaque, false);
this.UpdateStyles();
但是注意到picturebox沒有DoubleBuffered屬性,這裡都是修改的窗體form的DoubleBuffered屬性 ,并沒有什麼用。
還有各種複雜方法給picturebox加DoubleBuffered屬性的,還是沒啥用。
題外話,雙緩沖在sdl裡顯示效果還是比較好的。SDL_SetVideoMode() SDL第一個程式:加載一張圖檔
這篇部落格也有詳細介紹:
C# 在PictureBox 中繪圖防止閃爍的辦法
試了下,效率更低,閃爍更嚴重了。
注意到這篇部落格裡有pictureBox1.Refresh();
于是嘗試了下,結果問題解決了。很簡單。
image.Bitmap = bmp;
imageBox.Image = image;
imageBox.Refresh();
或者
pictureBox1.Image = bmp;
pictureBox1.Refresh();
估計是設定圖檔後強制重新整理才真正顯示吧。
但是使用pictureBox顯示圖檔有問題,就是長時間不斷重新整理後會崩潰。測試大概12小時多後程式崩潰。
是以還是先用Emgu.CV.UI.ImageBox吧
還待繼續研究。