Github Copilot 实战: 从零开始用AI写一个OCR工具

笔记哥 / 05-27 / 21点赞 / 0评论 / 730阅读
最近AI很火,咱也尝试一下由浅入深探索一下 Github Copilot 的能力和底限. 环境是 Windows11 + Microsoft Visual Studio Enterprise 2022 (64 位) - Current 版本 17.13.7 + VS内置的 Github Copilot Pro #### 项目目标 本项目旨在利用 Github Copilot 辅助开发,从零实现一个基于 AI 的 OCR(光学字符识别)工具。项目采用 .NET 9 和 WPF 技术栈,集成了 PaddleOCR 作为核心识别引擎,实现了图片文字识别、区域选择、结果高亮与复制等实用功能。 #### 主要技术与依赖 • 开发语言与平台:C#,.NET 9,WPF • OCR引擎:Sdcb.OpenVINO.PaddleOCR • 图像处理:OpenCvSharp • 界面交互:WPF,支持拖拽、粘贴、截图等多种图片输入方式 • AI辅助开发:Github Copilot 提供代码建议与自动补全 #### 核心功能 1. 图片输入 • 支持文件选择、拖拽、粘贴、屏幕截图等多种方式加载图片。 2. OCR识别 • 调用 PaddleOCR 进行文字识别,支持中文、英文等多语种。 • 识别结果实时显示,支持区域高亮和文字复制。 3. 用户体验优化 • 首次模型下载时,异步回调 UI,友好提示“正在初始化OCR模型,请稍候...”,避免用户等待时无响应。 • 识别过程有进度提示,提升交互体验。 4. 结果交互 • 支持鼠标框选图片区域,提取并复制选中区域的文字。 • 右键点击可复制单个识别文本。 #### 关键实现思路 • AI驱动开发:通过 Copilot 自动生成代码骨架、方法实现和注释,大幅提升开发效率。 • 异步与回调:模型下载和识别过程均为异步,UI 通过回调及时反馈进度和状态。 • 图像与坐标映射:实现了图片与控件坐标的精准映射,保证高亮和选区准确。 ### 源码 https://github.com/densen2014/Blazor100/tree/master/AI/MiOcr ### 首先创建wpf工程 ```csharp WinExe net9.0-windows enable enable true ``` 简单放置一个本地ocr服务 ```csharp using OpenCvSharp; using Sdcb.OpenVINO.PaddleOCR; using Sdcb.OpenVINO.PaddleOCR.Models; using Sdcb.OpenVINO.PaddleOCR.Models.Online; using System.Diagnostics; using System.Net.Http; namespace JovenApi; public class PaddleOCRService { public static bool IsUrl(string filename) { return Uri.TryCreate(filename, UriKind.Absolute, out var uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); } public async Task<(List strings, PaddleOcrResult result)> StartOCR(string filename) { Mat src; if (string.IsNullOrEmpty(filename)) { throw new ArgumentNullException(nameof(filename)); } if (IsUrl(filename)) { src = Cv2.ImDecode(await new HttpClient().GetByteArrayAsync(filename), ImreadModes.Color); } else { src = Cv2.ImRead(filename); } return await StartOCR(src); } public async Task<(List strings, PaddleOcrResult result)> StartOCR(byte[] imageData) { Mat src; ArgumentNullException.ThrowIfNull(imageData); src = Cv2.ImDecode(imageData, ImreadModes.Color); return await StartOCR(src); } public async Task<(List strings, PaddleOcrResult result)> StartOCR(Mat src) { PaddleOcrResult result; var resultText = new List(); FullOcrModel model = await OnlineFullModels.ChineseV3.DownloadAsync(); using (PaddleOcrAll all = new(model) { AllowRotateDetection = true, Enable180Classification = true, }) { Stopwatch sw = Stopwatch.StartNew(); result = all.Run(src); Console.WriteLine($"elapsed={sw.ElapsedMilliseconds} ms"); Console.WriteLine("Detected all texts: \n" + result.Text); foreach (PaddleOcrResultRegion region in result.Regions) { Console.WriteLine($"Text: {region.Text}, Score: {region.Score}, RectCenter: {region.Rect.Center}, RectSize: {region.Rect.Size}, Angle: {region.Rect.Angle}"); resultText.Add(region.Text); } } src.Dispose(); return (resultText, result); } } ``` ### A. 提示词 "实现拖放,粘贴图片或者点击打开选择文件获取一张图片, 并且调用ocr服务,将结果绘图到原图上, 右边显示相应的文本" 下面是一个完整的 WPF 方案,支持拖放图片、粘贴图片、点击选择图片,并调用 OCR 服务,将识别结果绘制到原图上,右侧显示文本。代码已适配你的 PaddleOCRService,并假设其 StartOCR(byte[] image) 返回识别结果(如文本框列表)。 1. MainWindow.xaml(UI布局) ```csharp