Project oxford vision API ocr异常
Posted
技术标签:
【中文标题】Project oxford vision API ocr异常【英文标题】:Project oxford vision API ocr exception 【发布时间】:2017-03-24 09:24:27 【问题描述】:牛津视觉 API 项目出现问题。 project oxford git 中的示例可以正常工作并识别图像上的文本。但是我的代码抛出异常:
引发了“Microsoft.ProjectOxford.Vision.ClientException”类型的异常。 在 Microsoft.ProjectOxford.Vision.VisionServiceClient.HandleException(异常异常) 在 Microsoft.ProjectOxford.Vision.VisionServiceClient.b__39_1[TRequest,TResponse](异常 e) 在 System.AggregateException.Handle(Func
2 predicate) at Microsoft.ProjectOxford.Vision.VisionServiceClient.<SendAsync>d__39
2.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.ProjectOxford.Vision.VisionServiceClient.d__32.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at ..OcrWorker.<UploadAndRecognizeImageAsync>d__15.MoveNext() in ..\\OcrWorker.cs:line 165\r\n --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() 在 ..OcrWorker.d__14.MoveNext() 在 ..\OcrWorker.cs:127 行
类代码:
public string SubscriptionKey get; set;
public string OcrResultText
get
if (FullOcrResult == null)
FullOcrResult = new StringBuilder();
string response = string.Empty;
if (OcrDone)
response = FullOcrResult.ToString();
else
response = null;
return response;
private bool OcrDone = true;
public bool IsOcrDone get return OcrDone;
private StringBuilder FullOcrResult;
public OcrWorker(string appKey)
SubscriptionKey = appKey;
FullOcrResult = new StringBuilder();
public string DoWorkSync(List<Bitmap> images)
if (OcrDone)
List<IterationItem> iteartionItems = new List<IterationItem>();
int i = 0;
OcrDone = false;
foreach (var image in images)
IterationItem ocrIterationItem = new IterationItem();
try
Task<IterationItem> o = DoWorkForIterationAsync(image, i);
o.Wait();
ocrIterationItem = o.Result;
catch (Exception ex)
var a = ex.GetBaseException();
iteartionItems.Add(ocrIterationItem);
i++;
GetOcrResultFromIterations(iteartionItems);
OcrDone = true;
return OcrResultText;
public void WriteResultToFile(string path)
if (OcrDone)
if (File.Exists(path))
File.Delete(path);
File.AppendAllText(path, OcrResultText);
private void GetOcrResultFromIterations(List<IterationItem> iterationResults)
iterationResults = iterationResults.OrderBy(item => item.Number).ToList();
foreach (var iterationItem in iterationResults)
var results = iterationItem.OcrResult;
FullOcrResult.AppendLine();
foreach (var item in results.Regions)
foreach (var line in item.Lines)
foreach (var word in line.Words)
FullOcrResult.Append(word.Text);
FullOcrResult.Append(" ");
FullOcrResult.AppendLine();
FullOcrResult.AppendLine();
/// <summary>
/// Perform the work for this scenario
/// </summary>
/// <param name="imageUri">The URI of the image to run against the scenario</param>
/// <param name="upload">Upload the image to Project Oxford if [true]; submit the Uri as a remote url if [false];</param>
/// <returns></returns>
private async Task<IterationItem> DoWorkForIterationAsync(Bitmap image, int iterationNumber)
var _status = "Performing OCR...";
//
// Upload an image
//
OcrResults ocrResult = await UploadAndRecognizeImageAsync(image, RecognizeLanguage.ShortCode);
_status = "OCR Done";
//
// Log analysis result in the log window
//
return new IterationItem()
Number = iterationNumber,
OcrResult = ocrResult
;
/// <summary>
/// Uploads the image to Project Oxford and performs OCR
/// </summary>
/// <param name="imageFilePath">The image file path.</param>
/// <param name="language">The language code to recognize for</param>
/// <returns></returns>
private async Task<OcrResults> UploadAndRecognizeImageAsync(Bitmap image, string language)
// -----------------------------------------------------------------------
// KEY SAMPLE CODE STARTS HERE
// -----------------------------------------------------------------------
//
// Create Project Oxford Vision API Service client
//
VisionServiceClient VisionServiceClient = new VisionServiceClient(SubscriptionKey);
Log("VisionServiceClient is created");
using (Stream imageMemoryStream = new MemoryStream())
image.Save(imageMemoryStream, ImageFormat.Bmp);
//
// Upload an image and perform OCR
//
Log("Calling VisionServiceClient.RecognizeTextAsync()...");
OcrResults ocrResult = await VisionServiceClient.RecognizeTextAsync(imageMemoryStream, language);
return ocrResult;
// -----------------------------------------------------------------------
// KEY SAMPLE CODE ENDS HERE
// -----------------------------------------------------------------------
//get ocred text
class IterationItem
public int Number get; set;
public OcrResults OcrResult get; set;
public static class RecognizeLanguage
public static string ShortCode get return "en";
public static string LongName get return "English";
有没有人遇到同样的问题,我该如何解决?
【问题讨论】:
解决了!对于正确的工作,您应该使用:UploadAndRecognizeImageAsync 方法中的 File.OpenRead(imageFilePath) 而不是:创建 MemoryStream 并将位图复制到它所以不要将内存流传递给 SDK 的 RecognizeTextAsync 方法 FileStream 解决方案很好,但如果您希望 MemoryStream 出于任何原因工作(例如,您需要在调用 OCR 之前裁剪或操作图像),您需要做的就是'rewind ' 首先通过调用imageMemoryStream.Position = 0
流。否则,您在 MemoryStream 上的“读取”指针位于image.Save()
之后。
【参考方案1】:
解决了!对于正确的工作,您应该使用 imageMemoryStream.Seek(0, SeekOrigin.Begin);从图像复制流后
【讨论】:
以上是关于Project oxford vision API ocr异常的主要内容,如果未能解决你的问题,请参考以下文章
json Google Cloud Vision API OpenAPI
Mobile Vision API (TEXT) 未检测到单个数字?
java Mobile Vision API修复了缺少自动对焦功能的问题