• C# OpenVINO 通用OCR识别 文字识别 中文识别 服务


    目录

    软件说明

    软件界面

    开启服务

    测试

    代码

    选择图片事件

    RotateImage

    ShowOCRResult

    耗时对比

    对比一

    对比二

    下载


    软件说明

    基于以下开源项目,做了再次封装

    https://github.com/sdcb/OpenVINO.NET

    自带模型,可离线部署;

    技术路线:VS2022+Sdcb.OpenVINO+Sdcb.OpenVINO.PaddleOCR+OpenCvSharp+NLog+Nancy.Hosting.Self

    软件界面

    开启服务

    OCRService started successfully
    可以使用post方式访问以下接口
    http://localhost:8082/ocr/stream //接收文件流,接收参数[file],返回识别信息
    http://localhost:8082/ocr/base64 //接收base64字符串,接收参数[base64str],返回识别信息

    测试

    代码

    选择图片事件

    try
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = fileFilter;
        if (ofd.ShowDialog() != DialogResult.OK) return;

        imgPath = ofd.FileName;
        bmp = new Bitmap(imgPath, true);

        RotateImage(bmp);

        pictureBox1.Image = bmp;

        richTextBox1.Clear();

        mat = new Mat(ofd.FileName);

        lock (Controller.OCRModule._locker)
        {
            dt1 = DateTime.Now;
            ocrResult = Program.paddleOcr.Run(mat);
            dt2 = DateTime.Now;
        }

        ShowOCRResult(ocrResult);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    RotateImage

    ///


    /// 根据图片exif调整方向
    ///

    ///
    public void RotateImage(Bitmap img)
    {
        var exif = img.PropertyItems;
        byte orien = 0;
        var item = exif.Where(m => m.Id == 274).ToArray();
        if (item.Length > 0)
            orien = item[0].Value[0];
        switch (orien)
        {
            case 2:
                img.RotateFlip(RotateFlipType.RotateNoneFlipX);//horizontal flip
                break;
            case 3:
                img.RotateFlip(RotateFlipType.Rotate180FlipNone);//right-top
                break;
            case 4:
                img.RotateFlip(RotateFlipType.RotateNoneFlipY);//vertical flip
                break;
            case 5:
                img.RotateFlip(RotateFlipType.Rotate90FlipX);
                break;
            case 6:
                img.RotateFlip(RotateFlipType.Rotate90FlipNone);//right-top
                break;
            case 7:
                img.RotateFlip(RotateFlipType.Rotate270FlipX);
                break;
            case 8:
                img.RotateFlip(RotateFlipType.Rotate270FlipNone);//left-bottom
                break;
            default:
                break;
        }
    }

    ShowOCRResult

    ///


    /// 显示结果
    ///

    private void ShowOCRResult(PaddleOcrResult ocrResult)
    {

        richTextBox1.Clear();
       // Bitmap bmp = new Bitmap();

        richTextBox1.AppendText(ocrResult.Text + "\n");

        richTextBox1.AppendText("-----------------------------------\n");
        richTextBox1.AppendText("耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\n");

        if (IsPixelFormatIndexed(bmp.PixelFormat))
        {
            bmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb);
            using (Image img = Image.FromFile(imgPath))
            {
                using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp))
                {
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    g.DrawImage(img, 0, 0);
                }
            }
        }
        else
        {
            using (Graphics g = Graphics.FromImage(bmp))
            {
                foreach (var item in ocrResult.Regions)
                {
                    g.DrawRectangle(pen, item.Rect.BoundingRect().Left, item.Rect.BoundingRect().Top, item.Rect.BoundingRect().Width, item.Rect.BoundingRect().Height);
                }
            }
        }

        pictureBox1.Image = null;
        pictureBox1.Image = bmp;
    }

    耗时对比

    与 PaddleInference.OCRService耗时对比

    对比一

    对比二

    下载

    可执行程序exe下载

    源码下载

  • 相关阅读:
    【2022-11-26】JS逆向之北京百姓网
    Java WebSocket框架
    Apache Doris (五十四): Doris Join类型 - Bucket Shuffle Join
    Chapter 11 Working with Dates and Times
    高斯分布可视化
    随机森林、AdaBoost 和 XGBoost 三者之间的主要区别
    Android busybox介绍
    magma build system 分析 —— 第04记 make -n 的记录
    使用Python编写Web接口
    C++基础——赋值运算符重载函数
  • 原文地址:https://blog.csdn.net/lw112190/article/details/133784164