当前位置: 首页 > news >正文

初尝PaddleOCR识别图片中的文字

引言

  • PaddleOCR是一个基于飞桨深度学习框架的OCR工具包,它集成了丰富的文字检测、识别和后处理算法,能够高效、准确地识别出图片中的文字。

说明

  • OpenVINO.NET是一个由开源开发者sdcb发布的,一个个强大的工具集,通过优化神经网络和加速推理,帮助他们快速构建高性能的机器学习和计算机视觉应用。
  • PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助力开发者训练出更好的模型,并应用落地。
 <Grid><Grid.RowDefinitions><RowDefinition Height="50"></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><!--添加两个按钮,分别设置打开图片和打开文本--><Button Grid.Row="0" Grid.Column="0" x:Name="btnOpenImage" Content="打开图片" Background="Blue" Foreground="White" Width="100" Height="40" HorizontalAlignment="Right" VerticalAlignment="Center" Click="btnDialog_Click"/><Button Grid.Row="0" Grid.Column="1"  x:Name="btnOcrTxt" Content="立即识别" Background="Green" Foreground="White" Width="100" Height="40" Margin="10,0" HorizontalAlignment="Left" VerticalAlignment="Center" Click="btnOrc_Click"/><!--添加两个边框 显示默认显示,打开后显示对应效果--><Border Grid.Row="1" Grid.Column="0" Margin="10,10"  BorderBrush="Gray" BorderThickness="1"><Image x:Name="myImage"  Stretch="Fill"></Image></Border><ScrollViewer Grid.Row="1" Grid.Column="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"><Border  Margin="10,10"  BorderBrush="Gray" BorderThickness="1"><TextBlock x:Name="myText" TextWrapping="Wrap"  Margin="0,10,0,0"  FontSize="18" /></Border></ScrollViewer></Grid>
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : System.Windows.Window
{private  string ImagePath=string.Empty;private Bitmap ImageInfo =null;private string pattern = @"[\u4e00-\u9fa50-9a-zA-Z]+";public MainWindow(){InitializeComponent();Settings.GlobalModelDirectory = System.IO.Path.Combine("D:\\WpfOcrApp\\Models");}private void btnDialog_Click(object sender, RoutedEventArgs e){Button btnUpload = (Button)sender;OpenFileDialog openFileDialog = new OpenFileDialog{Filter = "Image files (*.jpg;*.png;*.jpeg)|*.jpg;*.png;*.jpeg",Title = btnUpload.Name.Equals("btnOpenImage", StringComparison.OrdinalIgnoreCase) ? "选择图片" : "选择TXT文件"};bool? result = openFileDialog.ShowDialog();if (result == true){string filePath = openFileDialog.FileName;ImagePath = filePath;if (!string.IsNullOrWhiteSpace(filePath)){using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){// 创建一个BitmapImage对象并设置其StreamSource为FileStream  BitmapImage bitmapImage = new BitmapImage();bitmapImage.BeginInit();bitmapImage.StreamSource = stream;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();ImageInfo = new Bitmap(stream);// 确保Stream在BitmapImage使用之后被关闭  stream.Close();// 将BitmapImage对象设置为Image控件的Source  myImage.Source = bitmapImage;}}}}private void btnOrc_Click(object sender, RoutedEventArgs e){if (string.IsNullOrWhiteSpace(ImagePath)){myText.Text = $"请先选择图片";return;}OrcResult();}private void OrcResult(){// 如何模型不存在,则会自动下载,如果wpf 出现下载不下来,可以把这段代码在控制台上执行下载FullOcrModel fullOcrModel = OnlineFullModels.ChineseServerV4.DownloadAsync().GetAwaiter().GetResult();Mat src = Cv2.ImRead(@$"{ImagePath}");// 注意 使用CUP 最好设置一下DetectionStaticSize和RecognitionStaticWidth这两个参数// GPU 默认就设置了using (PaddleOcrAll all = new(fullOcrModel, new PaddleOcrOptions(new Sdcb.OpenVINO.DeviceOptions("CPU")) {DetectionStaticSize = new OpenCvSharp.Size(1024, 1024),RecognitionStaticWidth = 512}){AllowRotateDetection = true,Enable180Classification = true,}){StringBuilder builder = new StringBuilder();Stopwatch sw = Stopwatch.StartNew();PaddleOcrResult result = all.Run(src);builder.AppendLine($"总耗时:{sw.ElapsedMilliseconds} ms");string strText = result.Text;List<string> strings = strText.Split('\n').ToList();foreach (var item in strings){bool isMatch = Regex.IsMatch(item, pattern);if (isMatch)builder.AppendLine(item);}using (Graphics g = Graphics.FromImage(ImageInfo)){foreach (PaddleOcrResultRegion region in result.Regions){// 设置线条的样式(如颜色、粗细等)  System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Brushes.Red, 2);bool isMatch = Regex.IsMatch(region.Text, pattern);if (isMatch)g.DrawRectangle(pen, region.Rect.BoundingRect().Left, region.Rect.BoundingRect().Top, region.Rect.BoundingRect().Width, region.Rect.BoundingRect().Height);//builder.AppendLine($"Text: {region.Text}, Score: {region.Score}, RectCenter: {region.Rect.Center}, RectSize:    {region.Rect.Size}, Angle: {region.Rect.Angle}");}}myText.Text = builder.ToString();using (MemoryStream memory = new MemoryStream()){ImageInfo.Save(memory, System.Drawing.Imaging.ImageFormat.Png);memory.Position = 0;// 创建一个BitmapImage对象并设置其StreamSource为FileStream  BitmapImage bitmapImage = new BitmapImage();bitmapImage.BeginInit();bitmapImage.StreamSource = memory;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();// 确保Stream在BitmapImage使用之后被关闭  memory.Close();// 将BitmapImage对象设置为Image控件的Source  myImage.Source = bitmapImage;}}}
}

上述代码运行效果如下:
识别效果

参考

  • https://github.com/sdcb/OpenVINO.NET
  • https://github.com/paddlepaddle/PaddleOCR

相关文章:

  • 全自动化学发光分析仪测试一个样本需要多久时间?采样需要多久的时间?以及仪器原理是什么?
  • windows非白名单exe监控并杀死
  • 飞时达软件,揭开土方工程师的生活“面纱”
  • 数据库操作语言(DML)
  • jQuery 实例:掌握 JavaScript 库的奥秘
  • 番外篇 | YOLOv8改进之即插即用全维度动态卷积ODConv + 更换Neck网络为GFPN
  • Android adb logcat日志过滤输出
  • 【Windows】Bootstrap Studio(网页设计)软件介绍及安装步骤
  • MySQL之主从同步、分库分表
  • 0704模拟记录
  • 销毁终结者:IT 采购必知:高效数据销毁服务 文件销毁 硬盘销毁 数据销毁 销毁
  • [ruby on rails]rails6.0升级6.1
  • Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好
  • 一文解开关于UWB定位技术的认识误区
  • vue模板语法v-html
  • ----------
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • C++类中的特殊成员函数
  • java多线程
  • jQuery(一)
  • leetcode386. Lexicographical Numbers
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • PHP 7 修改了什么呢 -- 2
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python学习笔记 字符串拼接
  • Spring Cloud中负载均衡器概览
  • SpriteKit 技巧之添加背景图片
  • Web标准制定过程
  • 多线程事务回滚
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记一次用 NodeJs 实现模拟登录的思路
  • 力扣(LeetCode)21
  • 系统认识JavaScript正则表达式
  • 一文看透浏览器架构
  • 应用生命周期终极 DevOps 工具包
  • 智能网联汽车信息安全
  • 阿里云移动端播放器高级功能介绍
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 正则表达式-基础知识Review
  • # 安徽锐锋科技IDMS系统简介
  • # 透过事物看本质的能力怎么培养?
  • #Z0458. 树的中心2
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ${ }的特别功能
  • (2)Java 简介
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (九)c52学习之旅-定时器
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一) storm的集群安装与配置
  • .Net mvc总结
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [14]内置对象