当前位置:   article > 正文

Paddle OCR V4 测试Demo_ppocrv4

ppocrv4

目录

效果

项目

代码

下载 


效果

项目

VS2022+.net4.8+OCRV4

代码

using OpenCvSharp;
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PaddleInference.OCRServiceV4
{
    public partial class frmTest : Form
    {
        public frmTest()
        {
            InitializeComponent();
        }

        String startupPath;
        public PaddleOcrAll paddleOcr;
        private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        Bitmap bmp;
        PaddleOcrResult ocrResult;
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        String imgPath;
        Mat mat;
        Pen pen = new Pen(Brushes.Red, 2);

        private void frmTest_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
            startupPath = Application.StartupPath;
            rbOnnx.Checked = true;
        }

        private void btnLoadModel_Click(object sender, EventArgs e)
        {
            LoadModel();
            MessageBox.Show("加载完成");
        }

        void LoadModel()
        {
            string detectionModelDir;
            string classificationModelDir;
            string recognitionModelDir;
            string labelFilePath;

            if (comboBox1.SelectedIndex == 0)
            {
                detectionModelDir = startupPath + "\\inference\\ch_PP-OCRv4_det_infer";
                classificationModelDir = startupPath + "\\inference\\ch_ppocr_mobile_v2.0_cls_infer";
                recognitionModelDir = startupPath + "\\inference\\ch_PP-OCRv4_rec_infer";
                labelFilePath = startupPath + "\\inference\\ppocr_keys.txt";
            }
            else
            {
                detectionModelDir = startupPath + "\\inference_server\\detv4_teacher_inference";
                classificationModelDir = startupPath + "\\inference_server\\ch_ppocr_mobile_v2.0_cls_infer";
                recognitionModelDir = startupPath + "\\inference_server\\ch_PP-OCRv4_rec_server_infer";
                labelFilePath = startupPath + "\\inference_server\\ppocr_keys.txt";
            }

            FullOcrModel model = FullOcrModel.FromDirectory(detectionModelDir, classificationModelDir, recognitionModelDir, labelFilePath, ModelVersion.V4);

            if (rbOnnx.Enabled == true)
            {
                paddleOcr = new PaddleOcrAll(model, PaddleDevice.Onnx());
            }

            else if (rbOpenblas.Enabled == true)
            {
                paddleOcr = new PaddleOcrAll(model, PaddleDevice.Openblas());
            }

            else if (rbMkldnn.Enabled == true)
            {
                paddleOcr = new PaddleOcrAll(model, PaddleDevice.Mkldnn());
            }
            else
            {
                paddleOcr = new PaddleOcrAll(model);
            }

            paddleOcr.AllowRotateDetection = true;    /* 允许识别有角度的文字 */
            paddleOcr.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */
        }


        private void btnSelect_Click(object sender, EventArgs e)
        {
            if (paddleOcr == null)
            {
                MessageBox.Show("请先加载模型");
                return;
            }


            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);
            //pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);


            dt1 = DateTime.Now;
            ocrResult = paddleOcr.Run(mat);
            dt2 = DateTime.Now;


            ShowOCRResult(ocrResult);

        }

        /// <summary>
        /// 显示结果
        /// </summary>
        private void ShowOCRResult(PaddleOcrResult ocrResult)
        {

            richTextBox1.Clear();
            Bitmap bitmap = (Bitmap)this.pictureBox1.Image;


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

            using (Graphics g = Graphics.FromImage(bitmap))
            {
                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 = bitmap;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (paddleOcr == null)
            {
                MessageBox.Show("请先加载模型");
                return;
            }

            if (pictureBox1.Image == null)
            {
                return;
            }
            richTextBox1.Clear();
            Application.DoEvents();

            dt1 = DateTime.Now;
            ocrResult = paddleOcr.Run(mat);
            dt2 = DateTime.Now;

            ShowOCRResult(ocrResult);
        }

        /// <summary>
        /// 根据图片exif调整方向
        /// </summary>
        /// <param name="img"></param>
        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;
            }
        }

    }
}
 

  1. using OpenCvSharp;
  2. using Sdcb.PaddleInference;
  3. using Sdcb.PaddleOCR;
  4. using Sdcb.PaddleOCR.Models;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Windows.Forms;
  13. namespace PaddleInference.OCRServiceV4
  14. {
  15. public partial class frmTest : Form
  16. {
  17. public frmTest()
  18. {
  19. InitializeComponent();
  20. }
  21. String startupPath;
  22. public PaddleOcrAll paddleOcr;
  23. private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
  24. Bitmap bmp;
  25. PaddleOcrResult ocrResult;
  26. DateTime dt1 = DateTime.Now;
  27. DateTime dt2 = DateTime.Now;
  28. String imgPath;
  29. Mat mat;
  30. Pen pen = new Pen(Brushes.Red, 2);
  31. private void frmTest_Load(object sender, EventArgs e)
  32. {
  33. comboBox1.SelectedIndex = 0;
  34. startupPath = Application.StartupPath;
  35. rbOnnx.Checked = true;
  36. }
  37. private void btnLoadModel_Click(object sender, EventArgs e)
  38. {
  39. LoadModel();
  40. MessageBox.Show("加载完成");
  41. }
  42. void LoadModel()
  43. {
  44. string detectionModelDir;
  45. string classificationModelDir;
  46. string recognitionModelDir;
  47. string labelFilePath;
  48. if (comboBox1.SelectedIndex == 0)
  49. {
  50. detectionModelDir = startupPath + "\\inference\\ch_PP-OCRv4_det_infer";
  51. classificationModelDir = startupPath + "\\inference\\ch_ppocr_mobile_v2.0_cls_infer";
  52. recognitionModelDir = startupPath + "\\inference\\ch_PP-OCRv4_rec_infer";
  53. labelFilePath = startupPath + "\\inference\\ppocr_keys.txt";
  54. }
  55. else
  56. {
  57. detectionModelDir = startupPath + "\\inference_server\\detv4_teacher_inference";
  58. classificationModelDir = startupPath + "\\inference_server\\ch_ppocr_mobile_v2.0_cls_infer";
  59. recognitionModelDir = startupPath + "\\inference_server\\ch_PP-OCRv4_rec_server_infer";
  60. labelFilePath = startupPath + "\\inference_server\\ppocr_keys.txt";
  61. }
  62. FullOcrModel model = FullOcrModel.FromDirectory(detectionModelDir, classificationModelDir, recognitionModelDir, labelFilePath, ModelVersion.V4);
  63. if (rbOnnx.Enabled == true)
  64. {
  65. paddleOcr = new PaddleOcrAll(model, PaddleDevice.Onnx());
  66. }
  67. else if (rbOpenblas.Enabled == true)
  68. {
  69. paddleOcr = new PaddleOcrAll(model, PaddleDevice.Openblas());
  70. }
  71. else if (rbMkldnn.Enabled == true)
  72. {
  73. paddleOcr = new PaddleOcrAll(model, PaddleDevice.Mkldnn());
  74. }
  75. else
  76. {
  77. paddleOcr = new PaddleOcrAll(model);
  78. }
  79. paddleOcr.AllowRotateDetection = true; /* 允许识别有角度的文字 */
  80. paddleOcr.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */
  81. }
  82. private void btnSelect_Click(object sender, EventArgs e)
  83. {
  84. if (paddleOcr == null)
  85. {
  86. MessageBox.Show("请先加载模型");
  87. return;
  88. }
  89. OpenFileDialog ofd = new OpenFileDialog();
  90. ofd.Filter = fileFilter;
  91. if (ofd.ShowDialog() != DialogResult.OK) return;
  92. imgPath = ofd.FileName;
  93. bmp = new Bitmap(imgPath, true);
  94. RotateImage(bmp);
  95. pictureBox1.Image = bmp;
  96. richTextBox1.Clear();
  97. mat = new Mat(ofd.FileName);
  98. //pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
  99. dt1 = DateTime.Now;
  100. ocrResult = paddleOcr.Run(mat);
  101. dt2 = DateTime.Now;
  102. ShowOCRResult(ocrResult);
  103. }
  104. /// <summary>
  105. /// 显示结果
  106. /// </summary>
  107. private void ShowOCRResult(PaddleOcrResult ocrResult)
  108. {
  109. richTextBox1.Clear();
  110. Bitmap bitmap = (Bitmap)this.pictureBox1.Image;
  111. richTextBox1.AppendText("耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\n");
  112. richTextBox1.AppendText("-----------------------------------\n");
  113. richTextBox1.AppendText(ocrResult.Text + "\n");
  114. using (Graphics g = Graphics.FromImage(bitmap))
  115. {
  116. foreach (var item in ocrResult.Regions)
  117. {
  118. g.DrawRectangle(pen, item.Rect.BoundingRect().Left, item.Rect.BoundingRect().Top, item.Rect.BoundingRect().Width, item.Rect.BoundingRect().Height);
  119. }
  120. }
  121. pictureBox1.Image = null;
  122. pictureBox1.Image = bitmap;
  123. }
  124. private void button1_Click(object sender, EventArgs e)
  125. {
  126. if (paddleOcr == null)
  127. {
  128. MessageBox.Show("请先加载模型");
  129. return;
  130. }
  131. if (pictureBox1.Image == null)
  132. {
  133. return;
  134. }
  135. richTextBox1.Clear();
  136. Application.DoEvents();
  137. dt1 = DateTime.Now;
  138. ocrResult = paddleOcr.Run(mat);
  139. dt2 = DateTime.Now;
  140. ShowOCRResult(ocrResult);
  141. }
  142. /// <summary>
  143. /// 根据图片exif调整方向
  144. /// </summary>
  145. /// <param name="img"></param>
  146. public void RotateImage(Bitmap img)
  147. {
  148. var exif = img.PropertyItems;
  149. byte orien = 0;
  150. var item = exif.Where(m => m.Id == 274).ToArray();
  151. if (item.Length > 0)
  152. orien = item[0].Value[0];
  153. switch (orien)
  154. {
  155. case 2:
  156. img.RotateFlip(RotateFlipType.RotateNoneFlipX);//horizontal flip
  157. break;
  158. case 3:
  159. img.RotateFlip(RotateFlipType.Rotate180FlipNone);//right-top
  160. break;
  161. case 4:
  162. img.RotateFlip(RotateFlipType.RotateNoneFlipY);//vertical flip
  163. break;
  164. case 5:
  165. img.RotateFlip(RotateFlipType.Rotate90FlipX);
  166. break;
  167. case 6:
  168. img.RotateFlip(RotateFlipType.Rotate90FlipNone);//right-top
  169. break;
  170. case 7:
  171. img.RotateFlip(RotateFlipType.Rotate270FlipX);
  172. break;
  173. case 8:
  174. img.RotateFlip(RotateFlipType.Rotate270FlipNone);//left-bottom
  175. break;
  176. default:
  177. break;
  178. }
  179. }
  180. }
  181. }

下载 

Demo下载

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/679049
推荐阅读
相关标签
  

闽ICP备14008679号