天天看點

Emgu.CV/opencv 繪圖 線面文字包括中文

繪圖很簡單

Emgu.CV.Image<Bgr, Byte> image;

使用image.Draw可以畫各種圖形和文字包括英文及數字,不支援中文

CircleF circle = new CircleF(new System.Drawing.PointF(200, 200), 100.0f);

image.Draw(circle, new Bgr(255, 0, 0), 2);

image.Draw("11", new Point(300, 300), Emgu.CV.CvEnum.FontFace.HersheyDuplex, 0.6, new Bgr(0, 255, 255), 1);

或者使用CvInvoke繪圖或文字,同樣不支援中文

CvInvoke.PutText(image, "aa", new System.Drawing.Point(50, 50), Emgu.CV.CvEnum.FontFace.HersheyScriptComplex, 1, new MCvScalar(255, 255, 0), 2);

支援中文的方法:

建立一個位圖在上面寫文字,逐像素的修改image對應像素的rgb

效率不是很高

System.Drawing.Bitmap bmp;

bmp = new System.Drawing.Bitmap(200 45);  //建立個小圖檔,背景黑色rgb全是0,不是0的像素即為文字渲染過的,圖檔無需太大,容得下文字就好,不然周遊很耗時

Graphics g = Graphics.FromImage(bmp);
            Font drawFont = new Font("宋體", 24, FontStyle.Bold);
            g.DrawString("測試", drawFont, Brushes.Yellow, new PointF(0, 0));
            g.Save();
 
for (int i = 0; i < 200; i++)
                        {
                            for (int j = 0; j < 45; j++)
                            {
                                Color c = bmp.GetPixel(i, j); 
                                if (c.R > 0 || c.B > 0 || c.G > 0)
                                {
                                    CvInvoke.cvSet2D(image, j + 10, i, new MCvScalar(c.B, c.G, c.R)); //修改對應像素值
                                }
                            }
                        }