1
votes

Got a problem with project oxford vision API. The example from project oxford git works fine and recognise text on images. But my code throws exception:

Exception of type 'Microsoft.ProjectOxford.Vision.ClientException' was thrown. at Microsoft.ProjectOxford.Vision.VisionServiceClient.HandleException(Exception exception) at Microsoft.ProjectOxford.Vision.VisionServiceClient.b__39_1[TRequest,TResponse](Exception e) at System.AggregateException.Handle(Func2 predicate) at Microsoft.ProjectOxford.Vision.VisionServiceClient.<SendAsync>d__392.MoveNext() --- 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 Microsoft.ProjectOxford.Vision.VisionServiceClient.d__32.MoveNext() --- 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.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.TaskAwaiter1.GetResult() at ..OcrWorker.d__14.MoveNext() in ..\OcrWorker.cs:line 127

Class code:

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"; } }
    }

Did anyone have same problem and how can i solve it?

1
Solved! For correct work you should use: File.OpenRead(imageFilePath) in UploadAndRecognizeImageAsync method instead of: creating MemoryStream and copy bitmap to it So just don't pass memory stream to RecognizeTextAsync method of SDK - Nemo
The FileStream solution is fine, but if you want the MemoryStream to work for whatever reason (for example, you need to crop or manipulate the image before calling OCR), all you need to do is 'rewind' the stream first by calling imageMemoryStream.Position = 0. Otherwise your 'read' pointer on the MemoryStream is at the end after image.Save(). - cthrash

1 Answers

2
votes

Solved! For correct work you should use imageMemoryStream.Seek(0, SeekOrigin.Begin); after copy stream from image