EmguCV(OpenCV)實現高效顯示視頻(YUV)疊加包括漢字


 

視頻處理中,往往需要在上面增加文字包括漢字英文字母數字標點等,Emgu.CV/opencv 繪圖 線面文字包括中文 這篇里也有相關介紹,但是這篇里根據逐像素修改rgb值的方法效率太低 

 

查了很多資料,基本上opencv疊加漢字的方法都起源於這里

http://wenku.baidu.com/link?url=g1dCXwRbSpy7XUhsStRLANQRmvAXKSAa1ohrphx1R3XSZozi68WrTOrKjbxRnh9jWvF9Ass2SZKnvFrGE2ctCpZadNndhFrQzyj6XzLYZ1S

兩個for循環逐像素修改,在高清視頻里要修改的像素點量是非常巨大的,40ms一幀(25fps)Image<Bgr, Byte>的顯示基本不可能(C#估計效率比C++稍低)

 

注意到Image<Bgr, Byte>有Bitmap方法,

Image<Bgr, Byte> image = new Image<Bgr, Byte>(640, 480); 

Bitmap bmp = image.Bitmap;

 

而在Bitmap 里用C# GDI畫圖效率是很高的,於是獲取Bitmap

畫圖形文字方法可以參考前幾篇:

C# winform開發:Graphics、pictureBox同時畫多個矩形

c# winform 動態畫矩形 矩形大小可以拖動

GDI畫圖,判斷鼠標點擊點在某一畫好的多邊形、矩形、圖形里

平面內,線與線 兩條線找交點 兩條線段的位置關系(相交)判定與交點求解 C#

 

更多的GDI畫圖方法很簡單的,主要獲取控件的Graphics 

Graphics g = panel1.CreateGraphics

然后各種draw函數比opencv等提供的畫線函數強多了

 

然后嘗試使用C#自帶的picturebox顯示畫好的Bitmap,發現picturebox過幾分鍾就崩潰了打了個大叉叉,報內存錯誤。

怎么辦呢?

image.Bitmap = bmp;

嘗試把畫好的bmp重新設置為image.Bitmap ,運行正常

 

測試效率滿足需要,同時使用Emgu.CV.UI.ImageBox顯示image未發現延時、卡頓等現象,並且運行一天仍然正常。

g.DrawString("EmguCV顯示漢字", font16, new SolidBrush(Color.Red), new Point(1500, 100));

 

 

很簡單的方法,研究了一段時間。網上沒發現相關的文章,關於疊加文字全是如上論文所描述的情形,使用起來很糟糕,所以分享一下。

 

攝像機視頻幀解碼出yuv轉換Image<Bgr, Byte>參考之前的文章:

yuv420p轉為emgucv的圖像格式Emgu.CV.Image<Bgr, Byte>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM