/// <summary> /// Constructor for a feature extractor using Google Cloud Platform SDK, using a given annotator client, /// optimized to be used with a batch of images. /// </summary> /// <param name="imageStream"></param> /// <param name="client"></param> internal GcpFeatureExtractor(Stream imageStream, ImageAnnotatorClient client) { SetRotation(SKCodec.Create(imageStream).EncodedOrigin); var size = System.Drawing.Image.FromStream(imageStream).Size; Width = size.Width; Height = size.Height; _image = Image.FromStream(imageStream); _client = client; }
Image ConvertBitmapToGoogleImage(Bitmap bitmap) { using (var bitmapStream = new MemoryStream()) { bitmap.Save(bitmapStream, ImageFormat.Bmp); bitmapStream.Position = 0; return(Image.FromStream(bitmapStream)); } }
/// <summary> /// Constructor for a feature extractor using Google Cloud Platform SDK, optimized for analysing a single image. /// </summary> /// <param name="imageStream"></param> /// <param name="credentialsPath"></param> public GcpFeatureExtractor(Stream imageStream, string credentialsPath) { SetRotation(SKCodec.Create(imageStream).EncodedOrigin); var size = System.Drawing.Image.FromStream(imageStream).Size; Width = size.Width; Height = size.Height; var visionImage = Image.FromStream(imageStream); _client = new ImageAnnotatorClientBuilder() { CredentialsPath = credentialsPath }.Build(); _image = Image.FromStream(imageStream); }
private async Task DoOCR() { try { string Identifer = Utility.RandomHex(); DebugLog.Log("Making OCR request [" + Identifer + "]"); if (!File.Exists(Properties.Settings.Default.apiKeyPath)) { throw new FileNotFoundException("Keyfile not present at " + Properties.Settings.Default.apiKeyPath); } // Wait for rate limiter before starting the clock GoogleAsyncStatic.rate.Check(); Stopwatch sw = new Stopwatch(); // Dump the provided image to a memory stream var stream = new MemoryStream(); image.Save(stream, ImageFormat.Png); stream.Position = 0; // Load the stream as a gimage GImage gimage = GImage.FromStream(stream); // Make our connection client ImageAnnotatorClient client = new ImageAnnotatorClientBuilder { CredentialsPath = Properties.Settings.Default.apiKeyPath, }.Build(); // Ask for OCR sw.Start(); var response = await client.DetectTextAsync(gimage); sw.Stop(); // If we didn't get anything back if (response.Count == 0) { _bigBox = OCRBox.ErrorBigBox(); _smallBoxes = new OCRBox[] { }; } else { // First result is the big box _bigBox = new OCRBox(response.First()); // Following results are the small boxes _smallBoxes = response.Skip(1) .Select(ann => new OCRBox(ann)) .ToArray(); } _timeStamp = string.Format("{0:00}:{1:00}:{2:00}.{3:000}", sw.Elapsed.Hours, sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds); isDone = true; callback?.Invoke(this); DebugLog.Log("Finished OCR request [" + Identifer + "]"); } catch (Grpc.Core.RpcException e) { string url = ""; // Define a regular expression for repeated words. Regex rx = new Regex(@"(http\S*)", RegexOptions.Compiled | RegexOptions.IgnoreCase); // Find matches. MatchCollection matches = rx.Matches(e.Message); if (matches.Count > 0) { url = matches[0].Groups[0].Value; } Form.Invoke(Form.SafeLogWorkerError, new object[] { e.Message, url }); } catch (Exception e) { Form.Invoke(Form.SafeLogWorkerError, new object[] { e.Message, "" }); } }