目录
读取 API过程
默认情况下,服务从图像或文档(包括混合语言)中提取所有文本。 读取操作包含可选语言请求参数。 如果希望强制将文档作为该特定语言处理,则仅提供语言代码。 否则,服务可能会返回不完整和不正确的文本。
选择页面或页面范围以进行文本提取
默认情况下,服务从文档的所有页面提取文本。 (可选)使用 pages 请求参数指定页码或页面范围,以便仅从这些页面提取文本。
提交服务数据
ReadFileUrl的API调用
public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
{
// Read text from URL
var textHeaders = await client.ReadAsync(urlFile);
// After the request, get the operation location (operation ID)
string operationLocation = textHeaders.OperationLocation;
tbOcrResult.Text += operationLocation;
tbOcrResult.Text += Environment.NewLine;
// Retrieve the URI where the extracted text will be stored from the Operation-Location header.
// We only need the ID and not the full URL
const int numberOfCharsInOperationId = 36;
string operationId = operationLocation.Substring(operationLocation.Length - numberOfCharsInOperationId);
// Extract the text
ReadOperationResult results;
tbOcrResult.Text+=($"从 URL 文件 {Path.GetFileName(urlFile)}解析文本...");
tbOcrResult.Text += Environment.NewLine;
do
{
results = await client.GetReadResultAsync(Guid.Parse(operationId));
}
while ((results.Status == OperationStatusCodes.Running ||
results.Status == OperationStatusCodes.NotStarted));
tbOcrResult.Text += Environment.NewLine;
var textUrlFileResults = results.AnalyzeResult.ReadResults;
foreach (ReadResult page in textUrlFileResults)
{
tbOcrResult.Text += page.Language;
tbOcrResult.Text += Environment.NewLine;
tbOcrResult.Text += page.Width;
tbOcrResult.Text += Environment.NewLine;
tbOcrResult.Text += page.Height;
tbOcrResult.Text += Environment.NewLine;
tbOcrResult.Text += page.Angle;
tbOcrResult.Text += Environment.NewLine;
foreach (Line line in page.Lines)
{
tbOcrResult.Text += (line.Text);
tbOcrResult.Text += (line.Language);
tbOcrResult.Text += Environment.NewLine;
}
}
tbOcrResult.Text += Environment.NewLine;
}
ComputerVisionClientExtensions.ReadAsync Method
public static System.Threading.Tasks.Task<Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models.ReadHeaders> ReadAsync (this Microsoft.Azure.CognitiveServices.Vision.ComputerVision.IComputerVisionClient operations, string url, string language = default, System.Collections.Generic.IList<string> pages = default, string modelVersion = "latest", string readingOrder = "basic", System.Threading.CancellationToken cancellationToken = default);
参数
operations
IComputerVisionClient
url
String
language
String
pages
IList
modelVersion
String
readingOrder
String
cancellationToken
CancellationToken
返回
Task<ReadHeaders>
ReadHeaders Class
public class ReadHeaders
构造函数
ReadHeaders()
public ReadHeaders ();
ReadHeaders(String)
public ReadHeaders (string operationLocation = default);
Parameters
operationLocation
String
ReadHeaders.OperationLocation Property
[Newtonsoft.Json.JsonProperty(PropertyName="Operation-Location")]
public string OperationLocation { get; set; }
Property Value
String
Attributes
Newtonsoft.Json.JsonPropertyAttribute
探索ReadHeaders
那么究竟ReadHeaders是什么呢?
从字面上理解是读取头。
还有OperationLocation又是什么呢?它是ReadHeaders唯一的属性
调试代码
// Read text from URL
var textHeaders = await client.ReadAsync(urlFile);
// After the request, get the operation location (operation ID)
string operationLocation = textHeaders.OperationLocation;
tbOcrResult.Text += operationLocation;
tbOcrResult.Text += Environment.NewLine;
输出以下类似的格式
https://资源名.cognitiveservices.azure.com/vision/v3.2/read/analyzeResults/xxxxxx-xxxx-xxx
https://资源名.cognitiveservices.azure.com/为终结点
计算机视觉终结点的格式为 https://<your_computer_vision_resource_name>.cognitiveservices.azure.com/。
格式进一步简化为:
终结点/vision/v3.2/read/analyzeResults/xxxxxx-xxxx-xxx
xxxxxx-xxxx-xxx就是一串GUID表示的operationId
Guid 结构
定义
命名空间:
System程序集:
System.Runtime.dll表示全局唯一标识符 (GUID)。
Operation-Location
读取 API 的读取调用采用图像或 PDF 文档作为输入,以异步方式提取文本。
https://{endpoint}/vision/v3.2/read/analyze[?language][&pages][&readingOrder]
该调用返回时将包含一个名为 Operation-Location 的响应头字段。Operation-Location 值是一个 URL,其中包含要在下一步骤中使用的操作 ID。
响应标头 示例值
Operation-Location https://cognitiveservice/vision/v3.2/read/analyzeResults/49a36324-fc4b-4387-aa06-090cfbf0064f
public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
方法的前几行完成这个功能
public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
{
// Read text from URL
var textHeaders = await client.ReadAsync(urlFile);
// After the request, get the operation location (operation ID)
string operationLocation = textHeaders.OperationLocation;
红色圈起来的部分即是
https://{endpoint}/vision/v3.2/read/analyze[?language][&pages][&readingOrder]
operationId
检索提取文本所在的URI,该URI用于进一步提取文本操作,它被保存在操作位置标头(Operation Location header)中。
继续分析public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
代码
// Retrieve the URI where the extracted text will be stored from the Operation-Location header.
// We only need the ID and not the full URL
const int numberOfCharsInOperationId = 36;
string operationId = operationLocation.Substring(operationLocation.Length - numberOfCharsInOperationId);
我们只需要提取ID而不需要完整的URL
String.Substring
命名空间:
System
程序集:
netstandard.dll
从此实例检索子字符串。
重载
Substring(Int32)
从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。
Substring(Int32, Int32)
从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
Substring(Int32)
从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。
public string Substring (int startIndex);
参数
startIndex
Int32
此实例中子字符串的起始字符位置(从零开始)。
返回
String
与此实例中在 startIndex 处开头的子字符串等效的一个字符串;如果 Empty 等于此实例的长度,则为 startIndex。
例外
ArgumentOutOfRangeException
startIndex 小于零或大于此实例的长度。
提取operationId
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。
GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
就是最后36个字符串,所以才有const int numberOfCharsInOperationId = 36;
从下面PYTHON代码可计算长度
>>> a="6F9619FF-8B86-D011-B42D-00C04FC964FF"
>>> a
'6F9619FF-8B86-D011-B42D-00C04FC964FF'
>>> len(a)
36
获取服务结果
第二个步骤是调用获取读取结果操作。 此操作采用读取操作创建的操作 ID 作为输入。
https://{endpoint}/vision/v3.2/read/analyzeResults/{operationId}
此操作返回一个 JSON 响应,其中包含具有以下可能值的 status 字段。
值 含义
notStarted 尚未启动操作。
running 正在处理操作。
failed 操作失败。
succeeded 操作已成功执行。
可以不断地以迭代方式调用此操作,直到它返回 succeeded 值为止。 使用 1 到 2 秒的间隔可以避免超过每秒请求数 (RPS) 的速率限制。
ReadOperationResult Class
public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
接下来的代码
// Extract the text
ReadOperationResult results;
tbOcrResult.Text+=($"从 URL 文件 {Path.GetFileName(urlFile)}解析文本...");
tbOcrResult.Text += Environment.NewLine;
public class ReadOperationResult
构造函数
ReadOperationResult()
ReadOperationResult(OperationStatusCodes, String, String, AnalyzeResults)
属性
AnalyzeResult
CreatedDateTime
LastUpdatedDateTime
Status
接下来的代码
do
{
results = await client.GetReadResultAsync(Guid.Parse(operationId));
}
while ((results.Status == OperationStatusCodes.Running ||
results.Status == OperationStatusCodes.NotStarted));
results = await client.GetReadResultAsync(Guid.Parse(operationId));
得到异步读取结果
Parse(String)
将 GUID 的字符串表示形式转换为等效的 Guid 结构。
上面代码段的Guid.Parse(operationId)
就是参数operationId
返回为Task<ReadOperationResult>
还在继续运行或没开始,则继续获取结果
while ((results.Status == OperationStatusCodes.Running ||
results.Status == OperationStatusCodes.NotStarted));
免费层将请求速率限制为每分钟 20 次调用。 付费层允许的每秒请求数 (RPS) 为 30 个,此限制可通过请求提高。 注意你的 Azure
资源标识符和区域,并打开 Azure 支持票证或联系帐户团队,请求更高的每秒请求数 (RPS) 速率。当 status 字段的值为 succeeded 时,JSON 响应将包含从图像或文档提取的文本内容。 JSON
响应会维护已识别单词的原始分组。 其中包括提取的文本行及其边界框坐标。 每个文本行都包含所有提取的单词及其坐标和可信度分数。
提交到 Read 操作的数据将暂时加密并静态存储较短的一段时间,然后被删除。 这样,应用程序便可以检索提取的文本作为服务响应的一部分。
JSON 输出
下面是成功 JSON 响应示例:
{
"status": "succeeded",
"createdDateTime": "2021-02-04T06:32:08.2752706+00:00",
"lastUpdatedDateTime": "2021-02-04T06:32:08.7706172+00:00",
"analyzeResult": {
"version": "3.2",
"readResults": [
{
"page": 1,
"angle": 2.1243,
"width": 502,
"height": 252,
"unit": "pixel",
"lines": [
{
"boundingBox": [
58,
42,
314,
59,
311,
123,
56,
121
],
"text": "Tabs vs",
"appearance": {
"style": {
"name": "handwriting",
"confidence": 0.96
}
},
"words": [
{
"boundingBox": [
68,
44,
225,
59,
224,
122,
66,
123
],
"text": "Tabs",
"confidence": 0.933
},
{
"boundingBox": [
241,
61,
314,
72,
314,
123,
239,
122
],
"text": "vs",
"confidence": 0.977
}
]
}
]
}
]
}
}