我刚刚开始玩Google Cloud Vision。我想检测图像中的文字。受官方文档的启发(例如https://cloud.google.com/vision/docs/detecting-text和https://cloud.google.com/docs/authentication/production)我
我的代码如下所示:
using System;
using System.Windows;
using Google.Apis.Auth.OAuth2;
using Google.Cloud.Vision.V1;
using Grpc.Auth;
//...
private void Button_Click(object sender, RoutedEventArgs e)
{
// Load an image from a local file.
var image = Image.FromFile(@"C:\!\myimage.png");
var credential = GoogleCredential.FromFile(@"C:\!\credentials.json");
var channel = new Grpc.Core.Channel(@"https://vision.googleapis.com/v1/images:annotate",credential.ToChannelCredentials());
var client = ImageAnnotatorClient.Create(channel);
var response = client.DetectText(image); // <-- Nothing happens, app hangs, why?
foreach (var annotation in response)
{
if (annotation.Description != null)
Console.WriteLine(annotation.Description);
}
}
//...
在单步执行代码时,应用程序会挂起var response = client.DetectText(image);
(无例外或任何情况)。如果我使用其他方法(例如DetectLogos(image)
或DetectLabels(image)
),也会发生同样的情况。在检查CPU使用率和网络流量时,没有重要的事情发生(在相关代码行之前或之后)。
我在这里做错了什么?
谢谢!
答案 0 :(得分:0)
本教程帮助我成功使Vision API正常工作。我甚至尝试过标签,文字和面孔。您只需更新一些JS以及CS,即可使用您想要使用的任何视觉检测。
您需要更改的另一件事是上传图片而不是带网络摄像头的选项,这并不困难。
http://www.c-sharpcorner.com/article/using-google-vision-api-with-asp-net-mvc/
希望它有所帮助。
答案 1 :(得分:0)
提供的网址目标似乎与Vision REST API有关,但您正在创建GRPC频道。您应该将目标更改为:
var channel = new Grpc.Core.Channel(@"http://vision.googleapis.com",credential.ToChannelCredentials());
var client = ImageAnnotatorClient.Create(channel);
或者:
var channel = new Grpc.Core.Channel(ImageAnnotatorClient.DefaultEndpoint.Host, credential.ToChannelCredentials());
var client = ImageAnnotatorClient.Create(channel);
可以在ImageAnnotatorClient class下找到端点信息。
希望这有用。
答案 2 :(得分:0)
将路径传递给.json文件以实例化gRPC服务比它应该更加棘手。我们正在努力让它变得更容易。与此同时,这个样本最相关: https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/master/auth/AuthSample/Program.cs#L337
var credential = GoogleCredential.FromFile(jsonPath)
.CreateScoped(LanguageServiceClient.DefaultScopes);
var channel = new Grpc.Core.Channel(
LanguageServiceClient.DefaultEndpoint.ToString(),
credential.ToChannelCredentials());
var client = LanguageServiceClient.Create(channel);
它适用于不同的API,但它是正确的模式。