Beispiel #1
0
        static async System.Threading.Tasks.Task Main(string[] args)
        {
            var loadResult = @".\lib_\loadResult.txt";
            var language   = new Language("ja");

            if (!OcrEngine.IsLanguageSupported(language))
            {
                File.WriteAllText(loadResult, "False");
                throw new Exception($"{ language.LanguageTag } is not supported in this system.");
            }
            else
            {
                File.WriteAllText(loadResult, "True");
            }

            var inputPath  = @".\lib_\input.jpg";
            var outputPath = @".\lib_\output.txt";

            if (File.Exists(inputPath))
            {
                var stream  = File.OpenRead(inputPath);
                var decoder = await BitmapDecoder.CreateAsync(stream.AsRandomAccessStream());

                var bitmap = await decoder.GetSoftwareBitmapAsync();

                var engine    = OcrEngine.TryCreateFromLanguage(language);
                var ocrResult = await engine.RecognizeAsync(bitmap).AsTask();

                Console.WriteLine(ocrResult.Text);
                File.WriteAllText(outputPath, ocrResult.Text);
            }
        }
Beispiel #2
0
        public static async Task <string> ExtractTextAsync(Image img, string lang)
        {
            MemoryStream memoryStream             = new MemoryStream();
            InMemoryRandomAccessStream randStream = new InMemoryRandomAccessStream();
            string result = "";

            try
            {
                img.Save(memoryStream, ImageFormat.Bmp);
                await randStream.WriteAsync(memoryStream.ToArray().AsBuffer());

                if (!OcrEngine.IsLanguageSupported(new Language(lang)))
                {
                    Console.Write("This language is not supported!");
                }
                OcrEngine ocrEngine = OcrEngine.TryCreateFromLanguage(new Language(lang));
                if (ocrEngine == null)
                {
                    ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();
                }
                var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(randStream);

                OcrResult ocrResult = await ocrEngine.RecognizeAsync(await decoder.GetSoftwareBitmapAsync());

                result = ocrResult.Text;
                return(result);
            }
            finally
            {
                memoryStream.Dispose();
                randStream.Dispose();
                GC.Collect(0);
            }
        }
 private bool IsLanguageSupported(Language lang)
 {
     if (!OcrEngine.IsLanguageSupported(lang))
     {
         Debug.LogError("<MediaOCR> Language " + lang.DisplayName + " is not supported");
         return(false);
     }
     return(true);
 }
Beispiel #4
0
        public OcrDectection()
        {
            _ocrLanguage = new Language("nl");
            if (!OcrEngine.IsLanguageSupported(_ocrLanguage))
            {
                throw new Exception($"OCR language {_ocrLanguage} not supported.");
            }

            _ocrEngine = OcrEngine.TryCreateFromLanguage(_ocrLanguage);
        }
Beispiel #5
0
        private static async Task <string> OCRInternal(Bitmap bmp, string languageTag, bool singleLine = false)
        {
            Language language = new Language(languageTag);

            if (!OcrEngine.IsLanguageSupported(language))
            {
                throw new Exception($"{language.DisplayName} language is not available in this system for OCR.");
            }

            OcrEngine engine = OcrEngine.TryCreateFromLanguage(language);

            using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
            {
                bmp.Save(stream.AsStream(), ImageFormat.Bmp);
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

                using (SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync())
                {
                    OcrResult ocrResult = await engine.RecognizeAsync(softwareBitmap);

                    string separator;

                    if (singleLine)
                    {
                        separator = " ";
                    }
                    else
                    {
                        separator = Environment.NewLine;
                    }

                    if (language.LanguageTag.StartsWith("zh", StringComparison.OrdinalIgnoreCase) || // Chinese
                        language.LanguageTag.StartsWith("ja", StringComparison.OrdinalIgnoreCase) || // Japanese
                        language.LanguageTag.StartsWith("ko", StringComparison.OrdinalIgnoreCase))   // Korean
                    {
                        // If CJK language then remove spaces between words.
                        return(string.Join(separator, ocrResult.Lines.Select(line => string.Concat(line.Words.Select(word => word.Text)))));
                    }
                    else if (language.LayoutDirection == LanguageLayoutDirection.Rtl)
                    {
                        // If RTL language then reverse order of words.
                        return(string.Join(separator, ocrResult.Lines.Select(line => string.Join(" ", line.Words.Reverse().Select(word => word.Text)))));
                    }
                    else
                    {
                        return(string.Join(separator, ocrResult.Lines.Select(line => line.Text)));
                    }
                }
            }
        }
Beispiel #6
0
        static async Task <string> RecognizeAsync(string imagePath, string language)
        {
            StorageFile storageFile;
            var         path    = Path.GetFullPath(imagePath);                  // x.png
            var         extName = Path.GetExtension(path);                      // .png
            var         outPath = path.Replace(extName, "") + "-out" + extName; // x-out.png

            storageFile = await StorageFile.GetFileFromPathAsync(path);

            IRandomAccessStream randomAccessStream = await storageFile.OpenReadAsync();

            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream);

            SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);

            Globalization.Language lang = new Globalization.Language(language);
            string space  = language.Contains("zh") ? "" : " ";
            string result = null;

            if (OcrEngine.IsLanguageSupported(lang))
            {
                OcrEngine engine = OcrEngine.TryCreateFromLanguage(lang);
                if (engine != null)
                {
                    OcrResult ocrResult = await engine.RecognizeAsync(softwareBitmap);

                    foreach (var tempLine in ocrResult.Lines)
                    {
                        string line = "";
                        foreach (var word in tempLine.Words)
                        {
                            line += word.Text + space;
                        }
                        result += line + Environment.NewLine;
                    }
                }
            }
            else
            {
                throw new Exception(string.Format("Language {0} is not supported", language));
            };
            randomAccessStream.Dispose();
            softwareBitmap.Dispose();
            return(await Task <string> .Run(() =>
            {
                return result;
            }));
        }
Beispiel #7
0
        public async Task <(OCRPage, OctarineError, string)> GetTextFromStreamAsync(Stream istream)
        {
            var page = new OCRPage(System.Drawing.Image.FromStream(istream));

            istream.Seek(0, SeekOrigin.Begin);
            IRandomAccessStream stream = istream.AsRandomAccessStream();

            if (!OcrEngine.IsLanguageSupported(language))
            {
                return(null, OctarineError.LanguageNotSupported, null);
            }
            try {
                var engine  = OcrEngine.TryCreateFromLanguage(language);
                var decoder = await BitmapDecoder.CreateAsync(stream);

                var softwareBitmap = await decoder.GetSoftwareBitmapAsync();

                var ocrResult = await engine.RecognizeAsync(softwareBitmap);

                foreach (OcrLine line in ocrResult.Lines)
                {
                    string text = line.Text;
                    double x1 = -1, y1 = -1, x2 = -1, y2 = -1;
                    foreach (OcrWord word in line.Words)
                    {
                        if (x1 == -1 || x1 < word.BoundingRect.X)
                        {
                            x1 = word.BoundingRect.X;
                        }
                        if (y1 == -1 || y1 < word.BoundingRect.X)
                        {
                            y1 = word.BoundingRect.Y;
                        }
                        if (x2 == -1 || x2 > word.BoundingRect.X + word.BoundingRect.Width)
                        {
                            x2 = word.BoundingRect.X + word.BoundingRect.Width;
                        }
                        if (y2 == -1 || y2 > word.BoundingRect.Y + word.BoundingRect.Height)
                        {
                            y2 = word.BoundingRect.Y + word.BoundingRect.Height;
                        }
                    }
                    page.AddFragment(text, (int)x1, (int)y1, (int)(x2 - x1), (int)(y2 - y1));
                }
                return(page, OctarineError.Success, null);
            } catch (Exception ex) { return(null, OctarineError.EngineError, ex.Message); }
        }
        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// Ckecks if English language is avaiable for OCR on device and starts camera preview..
        /// </summary>
        /// <param name="e"></param>
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            displayInformation.OrientationChanged += DisplayInformation_OrientationChanged;

            if (!OcrEngine.IsLanguageSupported(ocrLanguage))
            {
                rootPage.NotifyUser(ocrLanguage.DisplayName + " is not supported.", NotifyType.ErrorMessage);

                return;
            }

            await StartCameraAsync();

            // Update buttons visibility.
            ExtractButton.Visibility = isInitialized ? Visibility.Visible : Visibility.Collapsed;
            CameraButton.Visibility  = isInitialized ? Visibility.Collapsed : Visibility.Visible;
        }
Beispiel #9
0
        private async void comboBox_Language_SelectedIndexChanged(object sender, EventArgs e)
        {
            ClearResult(0);

            m_language = new Windows.Globalization.Language(m_ro_listLanguage[comboBox_Language.SelectedIndex].LanguageTag);

            if (!OcrEngine.IsLanguageSupported(m_language))
            {
                MessageBox.Show(string.Format("'{0}' is not supported in this system!", m_language.DisplayName), "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (m_bitmap != null)
                {
                    await ImageToText(m_memoryStream);
                }
            }
        }
        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// Ckecks if English language is available for OCR on device and starts camera preview..
        /// </summary>
        /// <param name="e"></param>
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            displayInformation.OrientationChanged += DisplayInformation_OrientationChanged;

            // Useful to know when to initialize/clean up the camera
            Application.Current.Suspending += Application_Suspending;
            Application.Current.Resuming   += Application_Resuming;

            if (!OcrEngine.IsLanguageSupported(ocrLanguage))
            {
                rootPage.NotifyUser(ocrLanguage.DisplayName + " is not supported.", NotifyType.ErrorMessage);

                return;
            }

            await StartCameraAsync();

            // Update buttons visibility.
            ExtractButton.Visibility = isInitialized ? Visibility.Visible : Visibility.Collapsed;
            CameraButton.Visibility  = isInitialized ? Visibility.Collapsed : Visibility.Visible;
        }
Beispiel #11
0
 public static bool Lang(string lang)
 {
     try
     {
         var langtag = new Windows.Globalization.Language(lang);
         if (!OcrEngine.IsLanguageSupported(langtag))
         {
             return(false);
         }
         var engine = OcrEngine.TryCreateFromLanguage(langtag);
         if (engine == null)
         {
             return(false);
         }
         language = langtag;
     }
     catch
     {
         return(false);
     }
     return(true);
 }
Beispiel #12
0
        private static async Task <string> OCRInternal(Bitmap bmp, string languageTag)
        {
            Language language = new Language(languageTag);

            if (!OcrEngine.IsLanguageSupported(language))
            {
                throw new Exception($"{language.LanguageTag} is not supported in this system.");
            }

            OcrEngine engine = OcrEngine.TryCreateFromLanguage(language);

            using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
            {
                bmp.Save(stream.AsStream(), ImageFormat.Bmp);
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

                using (SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync())
                {
                    OcrResult ocrResult = await engine.RecognizeAsync(softwareBitmap);

                    return(string.Join("\r\n", ocrResult.Lines.Select(x => x.Text)));
                }
            }
        }
Beispiel #13
0
        static void scanFolder(Options _op)
        {
            op = _op;

            //OCRエンジン初期化
            OcrEngine engine = null;

            try
            {
                var lang = new Windows.Globalization.Language(op.Lang);
                if (!OcrEngine.IsLanguageSupported(lang))
                {
                    Console.Write("-lang {0}はOCRに対応していない言語です。\n", op.Lang);

                    foreach (var l in OcrEngine.AvailableRecognizerLanguages)
                    {
                        Console.Write("\t-l {0}\t{1}\n", l.LanguageTag, l.DisplayName);
                    }
                    Console.WriteLine("ms-settings:regionlanguage\n設定>時刻と言語>言語>+優先する言語を追加する>English(United States)\n設定からen-USを追加・ダウンロードしてください。");
                    Environment.Exit(1);
                }
                engine = OcrEngine.TryCreateFromLanguage(lang);
                if (engine == null)
                {
                    Console.WriteLine("OCR初期化に失敗しました。");
                    Environment.Exit(1);
                }
            }
            catch (Exception e)
            {
                Console.Write("Error\n{0}\n", e);
                Environment.Exit(1);
            }

            var isbns = new List <ISBN>();

            //指定フォルダ
            if (System.IO.Directory.Exists(op.Input))
            {
                var filelist = System.IO.Directory.GetFiles(op.Input);
                var lastfile = "";

                //先頭から指定ファイル数をOCR
                var count = op.Head;
                foreach (var file in filelist)
                {
                    if (count <= 0)
                    {
                        break;
                    }
                    lastfile = file;
                    Console.Write("Scan: {0}\n", file);
                    try
                    {
                        var result = scanFromImage(file, engine);
                        result.Wait();
                        var n = result.Result;
                        if (n.Count > 0)
                        {
                            isbns.AddRange(n);
                            if (op.Skip)
                            {
                                break;
                            }
                        }
                        count--;
                    }
                    catch (Exception e)
                    {
                        if ((UInt32)e.InnerException.HResult == (UInt32)0x88982F50)
                        {
                            //画像出ない
                        }
                        else
                        {
                            Console.Write("error\n{0}\n", e);
                        }
                    }
                }
                //最後尾から指定ファイル数をOCR
                Array.Reverse(filelist);
                count = op.Tail;
                foreach (var file in filelist)
                {
                    if (count <= 0)
                    {
                        break;
                    }
                    if (op.Skip && isbns.Count > 0)
                    {
                        break;
                    }
                    if (file == lastfile)
                    {
                        break;
                    }

                    Console.Write("Scan: {0}\n", file);
                    try
                    {
                        var result = scanFromImage(file, engine);
                        result.Wait();
                        var n = result.Result;
                        if (n.Count > 0)
                        {
                            isbns.AddRange(n);
                        }

                        count--;
                    }
                    catch (Exception e)
                    {
                        if ((UInt32)e.InnerException.HResult == (UInt32)0x88982F50)
                        {
                            //画像ではない
                        }
                        else
                        {
                            Console.Write("error\n{0}\n", e);
                        }
                    }
                }
            }
            else if (System.IO.File.Exists(op.Input))
            {
                Console.Write("Scan: {0}\n", op.Input);
                try
                {
                    var result = scanFromImage(op.Input, engine);
                    result.Wait();
                    var n = result.Result;
                    if (n.Count > 0)
                    {
                        isbns.AddRange(n);
                    }
                }
                catch (Exception e)
                {
                    if ((UInt32)e.InnerException.HResult == (UInt32)0x88982F50)
                    {
                        //画像出ない
                    }
                    else
                    {
                        Console.Write("error\n{0}\n", e);
                    }
                }
            }
            else
            {
                Console.WriteLine("対象を指定してください");
                Environment.Exit(1);
            }
            if (isbns.Count > 0)
            {
                //HITしたISBNをまとめて
                var isbnMap = new Dictionary <string, int>();
                foreach (var isbn in isbns)
                {
                    if (isbnMap.ContainsKey(isbn.ISBN13))
                    {
                        isbnMap[isbn.ISBN13] += isbn.Rank;
                    }
                    else
                    {
                        isbnMap[isbn.ISBN13] = isbn.Rank;
                    }
                }
                //ランクが高いISBNを一つ選択する
                {
                    string isbn = "";
                    int    max  = 0;
                    foreach (var k in isbnMap)
                    {
                        if (k.Value > max)
                        {
                            isbn = k.Key;
                            max  = k.Value;
                        }
                    }
                    if (max > 0)
                    {
                        Console.WriteLine("ISBN: " + isbn);
                        if (op.Out != null && op.Out != "")
                        {
                            System.IO.File.WriteAllText(op.Out, isbn);
                            Console.WriteLine("output: " + op.Out);
                        }
                    }
                }
            }
        }