快速入门:使用计算机视觉 C# SDK 提取手写文本

本快速入门将使用适用于 C# 的计算机视觉 SDK 从图像中提取手写文本或印刷体文本。 如果你愿意,可以从 GitHub 上的认知服务 Csharp 视觉存储库下载本指南中的代码作为完整的示例应用。

先决条件

创建并运行示例应用

若要运行此示例,请执行以下步骤:

  1. 在 Visual Studio 中创建一个新的 Visual C# 控制台应用。

  2. 安装计算机视觉客户端库 NuGet 包。

    1. 在菜单上,单击“工具”,然后依次选择“NuGet 包管理器”、“管理解决方案的 NuGet 包” 。
    2. 单击“浏览” 选项卡,在“搜索” 框中键入“Microsoft.Azure.CognitiveServices.Vision.ComputerVision”。
    3. 选择显示的 Microsoft.Azure.CognitiveServices.Vision.ComputerVision,单击项目名称旁边的复选框,然后单击“安装” 。
  3. Program.cs 替换为以下代码。 BatchReadFileAsyncBatchReadFileInStreamAsync 方法分别为远程图像和本地图像包装批量读取 APIGetReadOperationResultAsync 方法包装获取读取操作结果 API

    using Microsoft.Azure.CognitiveServices.Vision.ComputerVision;
    using Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models;
    
    using System;
    using System.IO;
    using System.Threading.Tasks;
    
    namespace ExtractText
    {
        class Program
        {
            // subscriptionKey = "0123456789abcdef0123456789ABCDEF"
            private const string subscriptionKey = "<Subscription key>";
    
            // localImagePath = @"C:\Documents\LocalImage.jpg"
            private const string localImagePath = @"<LocalImage>";
    
            private const string remoteImageUrl =
                "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Cursive_Writing_on_Notebook_paper.jpg/800px-Cursive_Writing_on_Notebook_paper.jpg";
    
            private const int numberOfCharsInOperationId = 36;
    
            static void Main(string[] args)
            {
                ComputerVisionClient computerVision = new ComputerVisionClient(
                    new ApiKeyServiceClientCredentials(subscriptionKey),
                    new System.Net.Http.DelegatingHandler[] { });
    
                computerVision.Endpoint = "https://api.cognitive.azure.cn";
    
                Console.WriteLine("Images being analyzed ...");
                var t1 = ExtractRemoteTextAsync(computerVision, remoteImageUrl);
                var t2 = ExtractLocalTextAsync(computerVision, localImagePath);
    
                Task.WhenAll(t1, t2).Wait(5000);
                Console.WriteLine("Press ENTER to exit");
                Console.ReadLine();
            }
    
            // Read text from a remote image
            private static async Task ExtractRemoteTextAsync(
                ComputerVisionClient computerVision, string imageUrl)
            {
                if (!Uri.IsWellFormedUriString(imageUrl, UriKind.Absolute))
                {
                    Console.WriteLine(
                        "\nInvalid remoteImageUrl:\n{0} \n", imageUrl);
                    return;
                }
    
                // Start the async process to read the text
                BatchReadFileHeaders textHeaders =
                    await computerVision.BatchReadFileAsync(
                        imageUrl);
    
                await GetTextAsync(computerVision, textHeaders.OperationLocation);
            }
    
            // Recognize text from a local image
            private static async Task ExtractLocalTextAsync(
                ComputerVisionClient computerVision, string imagePath)
            {
                if (!File.Exists(imagePath))
                {
                    Console.WriteLine(
                        "\nUnable to open or read localImagePath:\n{0} \n", imagePath);
                    return;
                }
    
                using (Stream imageStream = File.OpenRead(imagePath))
                {
                    // Start the async process to recognize the text
                    BatchReadFileInStreamHeaders textHeaders =
                        await computerVision.BatchReadFileInStreamAsync(
                            imageStream);
    
                    await GetTextAsync(computerVision, textHeaders.OperationLocation);
                }
            }
    
            // Retrieve the recognized text
            private static async Task GetTextAsync(
                ComputerVisionClient computerVision, string operationLocation)
            {
                // Retrieve the URI where the recognized text will be
                // stored from the Operation-Location header
                string operationId = operationLocation.Substring(
                    operationLocation.Length - numberOfCharsInOperationId);
    
                Console.WriteLine("\nCalling GetHandwritingRecognitionOperationResultAsync()");
                ReadOperationResult result =
                    await computerVision.GetReadOperationResultAsync(operationId);
    
                // Wait for the operation to complete
                int i = 0;
                int maxRetries = 10;
                while ((result.Status == TextOperationStatusCodes.Running ||
                        result.Status == TextOperationStatusCodes.NotStarted) && i++ < maxRetries)
                {
                    Console.WriteLine(
                        "Server status: {0}, waiting {1} seconds...", result.Status, i);
                    await Task.Delay(1000);
    
                    result = await computerVision.GetReadOperationResultAsync(operationId);
                }
    
                // Display the results
                Console.WriteLine();
                var recResults = result.RecognitionResults;
                foreach (TextRecognitionResult recResult in recResults)
                {
                    foreach (Line line in recResult.Lines)
                    {
                        Console.WriteLine(line.Text);
                    }
                }
                Console.WriteLine();
            }
        }
    }
    
  4. <Subscription Key> 替换为有效订阅密钥。

  5. 如有必要,将 computerVision.Endpoint 更改为与订阅密钥关联的 Azure 区域。

  6. <LocalImage> 替换为本地图像的路径和文件名。

  7. (可选)将 remoteImageUrl 设置为另一图像。

  8. 运行该程序。

检查响应

成功的响应会输出每个图像的各行已识别文本。

Calling GetHandwritingRecognitionOperationResultAsync()

Calling GetHandwritingRecognitionOperationResultAsync()
Server status: Running, waiting 1 seconds...
Server status: Running, waiting 1 seconds...

dog
The quick brown fox jumps over the lazy
Pack my box with five dozen liquor jugs

后续步骤

探索用于分析图像、检测名人和地标、创建缩略图以及提取印刷体文本和手写文本的计算机视觉 API。