在上一篇里,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吧
還待繼續研究。