Google Vision API的不同文本检测结果

问题描述 投票:2回答:2

从同一图像的.Net代码和演示应用程序获取不同的文本检测结果google vision api result.net result

这是我的代码:

            var response = vision.Images.Annotate(
            new BatchAnnotateImagesRequest()
            {
                Requests = new[]
                {
                    new AnnotateImageRequest()
                    {
                        Features = new[]
                        {
                            new Feature()
                            {
                                Type =
                                    "TEXT_DETECTION"
                            }
                        },
                        Image = image
                    }
                }
            }).Execute();
.net google-cloud-vision google-vision
2个回答
7
投票

正如埃米尔的回答所指出的那样,你需要DOCUMENT_TEXT_DETECTION特征而不是TEXT_DETECTION。但是,您可以比使用当前代码更简单地完成所有操作。

我建议使用Google.Apis.Vision.V1(使用gRPC端点,希望更容易使用),而不是使用Google.Cloud.Vision.V1(它看起来像你正在做,并使用REST端点)。免责声明:我在后一个库上工作)。注意,您可以使用REST端点完成大部分工作。

这是使用后一个库的完整示例。

using Google.Cloud.Vision.V1;
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var client = ImageAnnotatorClient.Create();
        var image = Image.FromUri("https://i.stack.imgur.com/H21rL.png");
        var annotations = client.DetectDocumentText(image);
        var paragraphs = annotations.Pages
            .SelectMany(page => page.Blocks)
            .SelectMany(block => block.Paragraphs);
        foreach (var para in paragraphs)
        {
            var box = para.BoundingBox;
            Console.WriteLine($"Bounding box: {string.Join(" / ", box.Vertices.Select(v => $"({v.X}, {v.Y})"))}");
            var symbols = string.Join("", para.Words.SelectMany(w => w.Symbols).SelectMany(s => s.Text));
            Console.WriteLine($"Paragraph: {symbols}");
            Console.WriteLine();
        }
    }
}

这会丢失符号之间的空格,但会显示正在检测所有文本 - 并且执行实际检测的方法调用非常简单:

var client = ImageAnnotatorClient.Create();
var image = Image.FromUri("https://i.stack.imgur.com/H21rL.png");
var annotations = client.DetectDocumentText(image);

上面的大多数代码都是处理响应。


1
投票

发现问题,根据documentation使用Vision API时我们应该使用DOCUMENT_TEXT_DETECTION

+-------------------------+-----------------------------------------------------------------------------------------------------------------+
| TEXT_DETECTION          | Run OCR.                                                                                                        |
+-------------------------+-----------------------------------------------------------------------------------------------------------------+
| DOCUMENT_TEXT_DETECTION | Run dense text document OCR. Takes precedence when both DOCUMENT_TEXT_DETECTION and TEXT_DETECTION are present. |
+-------------------------+-----------------------------------------------------------------------------------------------------------------+

因此代码应如下所示:

var response = vision.Images.Annotate(
            new BatchAnnotateImagesRequest()
            {
                Requests = new[]
                {
                    new AnnotateImageRequest()
                    {
                        Features = new[]
                        {
                            new Feature()
                            {
                                Type =
                                    "DOCUMENT_TEXT_DETECTION"
                            }
                        },
                        Image = image
                    }
                }
            }).Execute();
© www.soinside.com 2019 - 2024. All rights reserved.