├── Assets ├── Bon.jpg ├── 191321.jpg ├── 600143.jpg ├── Pfandbeleg.jpg ├── Unbenannt.jpg ├── imagemb7g91ij6p.jpg ├── kassenbon-207-217-wasserz.gif ├── kasse_kassenbon_bote_tütenbon.png └── Belegsammlung_Weinkellerei_PROST_Beleg_1.gif ├── img └── pfandbeleg.png ├── attic ├── CharacterRecognition2 │ ├── Assets │ │ ├── socks.jpg │ │ ├── ractive.png │ │ ├── amoklauf.png │ │ └── devjobs_lingo.png │ ├── App.config │ ├── Properties │ │ ├── Settings.settings │ │ ├── Settings.Designer.cs │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ └── Resources.resx │ ├── Program.cs │ ├── MainWnd.cs │ ├── CharacterRecognition2.csproj │ ├── MainWnd.resx │ └── MainWnd.Designer.cs └── README.md ├── CharacterRecognition ├── appsettings.json ├── Services │ ├── IOcrService.cs │ └── OcrService.cs ├── Properties │ ├── Settings.settings │ ├── Settings.Designer.cs │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── Configuration │ └── OcrOptions.cs ├── Program.cs ├── CharacterRecognition.csproj └── Forms │ ├── MainWnd.cs │ ├── MainWnd.Designer.cs │ └── MainWnd.resx ├── LICENSE ├── OpenCV.sln ├── scripts └── Download-Tessdata.ps1 ├── README.md └── .gitignore /Assets/Bon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/Bon.jpg -------------------------------------------------------------------------------- /Assets/191321.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/191321.jpg -------------------------------------------------------------------------------- /Assets/600143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/600143.jpg -------------------------------------------------------------------------------- /img/pfandbeleg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/img/pfandbeleg.png -------------------------------------------------------------------------------- /Assets/Pfandbeleg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/Pfandbeleg.jpg -------------------------------------------------------------------------------- /Assets/Unbenannt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/Unbenannt.jpg -------------------------------------------------------------------------------- /Assets/imagemb7g91ij6p.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/imagemb7g91ij6p.jpg -------------------------------------------------------------------------------- /Assets/kassenbon-207-217-wasserz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/kassenbon-207-217-wasserz.gif -------------------------------------------------------------------------------- /Assets/kasse_kassenbon_bote_tütenbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/kasse_kassenbon_bote_tütenbon.png -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Assets/socks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/attic/CharacterRecognition2/Assets/socks.jpg -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Assets/ractive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/attic/CharacterRecognition2/Assets/ractive.png -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Assets/amoklauf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/attic/CharacterRecognition2/Assets/amoklauf.png -------------------------------------------------------------------------------- /Assets/Belegsammlung_Weinkellerei_PROST_Beleg_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/Assets/Belegsammlung_Weinkellerei_PROST_Beleg_1.gif -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Assets/devjobs_lingo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brakmic/OpenCV/HEAD/attic/CharacterRecognition2/Assets/devjobs_lingo.png -------------------------------------------------------------------------------- /CharacterRecognition/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Ocr": { 3 | "TessdataPath": "tessdata", 4 | "Language": "eng", 5 | "EngineMode": "Default" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /attic/README.md: -------------------------------------------------------------------------------- 1 | # Attic 2 | 3 | Old experimental projects no longer maintained. 4 | 5 | ## CharacterRecognition2 6 | 7 | Unfinished experimental project from 2016. Contains only basic image loading, grayscale conversion, and XML serialization tests. No OCR functionality. 8 | -------------------------------------------------------------------------------- /CharacterRecognition/Services/IOcrService.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.Versioning; 2 | 3 | namespace OcrApp.Services 4 | { 5 | [SupportedOSPlatform("windows6.1")] 6 | public interface IOcrService 7 | { 8 | string ExtractText(string imagePath); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /CharacterRecognition/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CharacterRecognition/Configuration/OcrOptions.cs: -------------------------------------------------------------------------------- 1 | using Emgu.CV.OCR; 2 | 3 | namespace OcrApp.Configuration 4 | { 5 | public class OcrOptions 6 | { 7 | public const string SectionName = "Ocr"; 8 | 9 | public string TessdataPath { get; set; } = "tessdata"; 10 | public string Language { get; set; } = "eng"; 11 | public OcrEngineMode EngineMode { get; set; } = OcrEngineMode.Default; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace CharacterRecognition2 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new MainWnd()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Harris Brakmic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /CharacterRecognition/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CharacterRecognition.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CharacterRecognition2.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /CharacterRecognition/Services/OcrService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Versioning; 3 | using Emgu.CV; 4 | using Emgu.CV.OCR; 5 | using Emgu.CV.Structure; 6 | using Microsoft.Extensions.Options; 7 | using OcrApp.Configuration; 8 | 9 | namespace OcrApp.Services 10 | { 11 | [SupportedOSPlatform("windows6.1")] 12 | public class OcrService : IOcrService 13 | { 14 | private readonly OcrOptions options; 15 | private readonly string tessdataPath; 16 | 17 | public OcrService(IOptions options) 18 | { 19 | this.options = options.Value; 20 | tessdataPath = System.IO.Path.IsPathRooted(this.options.TessdataPath) 21 | ? this.options.TessdataPath 22 | : System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, this.options.TessdataPath); 23 | } 24 | 25 | public string ExtractText(string imagePath) 26 | { 27 | if (string.IsNullOrEmpty(imagePath)) 28 | { 29 | throw new ArgumentException("Image path cannot be null or empty"); 30 | } 31 | 32 | using var img = new Image(imagePath); 33 | using var ocrProvider = new Tesseract(tessdataPath, options.Language, options.EngineMode); 34 | ocrProvider.SetImage(img); 35 | ocrProvider.Recognize(); 36 | return ocrProvider.GetUTF8Text().TrimEnd(); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /CharacterRecognition/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Versioning; 3 | using System.Windows.Forms; 4 | using Microsoft.Extensions.Configuration; 5 | using Microsoft.Extensions.DependencyInjection; 6 | using OcrApp.Configuration; 7 | using OcrApp.Forms; 8 | using OcrApp.Services; 9 | 10 | namespace OcrApp 11 | { 12 | static class Program 13 | { 14 | public static IConfiguration Configuration { get; private set; } = null!; 15 | 16 | [STAThread] 17 | [SupportedOSPlatform("windows6.1")] 18 | static void Main() 19 | { 20 | Application.EnableVisualStyles(); 21 | Application.SetCompatibleTextRenderingDefault(false); 22 | 23 | Configuration = new ConfigurationBuilder() 24 | .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 25 | .Build(); 26 | 27 | var services = new ServiceCollection(); 28 | ConfigureServices(services); 29 | var serviceProvider = services.BuildServiceProvider(); 30 | 31 | var mainForm = serviceProvider.GetRequiredService(); 32 | Application.Run(mainForm); 33 | } 34 | 35 | [SupportedOSPlatform("windows6.1")] 36 | private static void ConfigureServices(ServiceCollection services) 37 | { 38 | services.Configure(Configuration.GetSection(OcrOptions.SectionName)); 39 | services.AddSingleton(); 40 | services.AddTransient(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /CharacterRecognition/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CharacterRecognition")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("CharacterRecognition")] 13 | [assembly: AssemblyCopyright("Copyright © 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("b54cdc3d-1676-4929-9644-42e77656fcb6")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("CharacterRecognition2")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("CharacterRecognition2")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("daa7feff-b3f1-402d-a37b-b0361ae0761d")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CharacterRecognition/CharacterRecognition.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | WinExe 4 | net10.0-windows 5 | true 6 | x64 7 | CharacterRecognition 8 | CharacterRecognition 9 | enable 10 | false 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | PreserveNewest 24 | 25 | 26 | PreserveNewest 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /OpenCV.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CharacterRecognition", "CharacterRecognition\CharacterRecognition.csproj", "{B54CDC3D-1676-4929-9644-42E77656FCB6}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Apps", "Apps", "{9457EC4F-F7E5-4E70-9711-CD563C86E2FF}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Debug|x64 = Debug|x64 14 | Release|Any CPU = Release|Any CPU 15 | Release|x64 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Debug|x64.ActiveCfg = Debug|x64 21 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Debug|x64.Build.0 = Debug|x64 22 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Release|Any CPU.Build.0 = Release|Any CPU 24 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Release|x64.ActiveCfg = Release|x64 25 | {B54CDC3D-1676-4929-9644-42E77656FCB6}.Release|x64.Build.0 = Release|x64 26 | EndGlobalSection 27 | GlobalSection(SolutionProperties) = preSolution 28 | HideSolutionNode = FALSE 29 | EndGlobalSection 30 | GlobalSection(NestedProjects) = preSolution 31 | {B54CDC3D-1676-4929-9644-42E77656FCB6} = {9457EC4F-F7E5-4E70-9711-CD563C86E2FF} 32 | EndGlobalSection 33 | EndGlobal 34 | -------------------------------------------------------------------------------- /scripts/Download-Tessdata.ps1: -------------------------------------------------------------------------------- 1 | # Download Tesseract trained data 2 | # Compatible with PowerShell 5.1 and PowerShell Core 7+ 3 | 4 | param( 5 | [string]$TessdataPath = "tessdata", 6 | [string]$Language = "eng" 7 | ) 8 | 9 | $ErrorActionPreference = "Stop" 10 | 11 | $tessdataUrl = "https://github.com/tesseract-ocr/tessdata/raw/main/$Language.traineddata" 12 | $targetFile = Join-Path $TessdataPath "$Language.traineddata" 13 | 14 | Write-Host "checking for tessdata folder..." -ForegroundColor Cyan 15 | 16 | if (-not (Test-Path $TessdataPath)) { 17 | Write-Host "creating tessdata folder: $TessdataPath" -ForegroundColor Yellow 18 | New-Item -ItemType Directory -Path $TessdataPath -Force | Out-Null 19 | } 20 | 21 | if (Test-Path $targetFile) { 22 | Write-Host "tessdata already exists: $targetFile" -ForegroundColor Green 23 | Write-Host "skipping download" -ForegroundColor Green 24 | exit 0 25 | } 26 | 27 | Write-Host "downloading tesseract trained data..." -ForegroundColor Cyan 28 | Write-Host "source: $tessdataUrl" -ForegroundColor Gray 29 | Write-Host "target: $targetFile" -ForegroundColor Gray 30 | 31 | try { 32 | if ($PSVersionTable.PSVersion.Major -ge 6) { 33 | Invoke-WebRequest -Uri $tessdataUrl -OutFile $targetFile -UseBasicParsing 34 | } else { 35 | [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 36 | Invoke-WebRequest -Uri $tessdataUrl -OutFile $targetFile -UseBasicParsing 37 | } 38 | 39 | $fileSize = (Get-Item $targetFile).Length / 1MB 40 | Write-Host "download completed successfully" -ForegroundColor Green 41 | Write-Host "file size: $([math]::Round($fileSize, 2)) MB" -ForegroundColor Gray 42 | } 43 | catch { 44 | Write-Host "download failed: $_" -ForegroundColor Red 45 | exit 1 46 | } 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenCV Character Recognition 2 | 3 | A Windows Forms application for OCR text extraction from images using [EmguCV](https://github.com/emgucv/emgucv) and [Tesseract](https://github.com/tesseract-ocr). 4 | 5 | ## About This Project 6 | 7 | This project was originally created ten years ago and remained unchanged since then. In 2025 I decided to modernize it and remove the cumbersome manual EmguCV/OpenCV installation process. The new version uses NuGet packages instead, making setup much simpler. 8 | 9 | ## Features 10 | 11 | - OCR text extraction from images 12 | - Support for multiple image formats (JPG, PNG, GIF, BMP) 13 | - Modern async/await patterns for responsive UI 14 | - No manual environment setup required 15 | - All dependencies managed through NuGet 16 | 17 | ## Requirements 18 | 19 | - Windows 10 or later 20 | - .NET 10 SDK 21 | - Visual Studio 2022 or VS Code with C# Dev Kit 22 | 23 | ## Setup 24 | 25 | No manual environment configuration needed. The build process automatically downloads required Tesseract language data. 26 | 27 | ```bash 28 | git clone https://github.com/brakmic/OpenCV.git 29 | cd OpenCV 30 | dotnet build 31 | ``` 32 | 33 | The first build will download tessdata files automatically. 34 | 35 | ### Additional Languages 36 | 37 | By default, only English language data is downloaded. To use other languages, download them manually using the provided script. 38 | 39 | Example for German: 40 | 41 | ```bash 42 | pwsh -ExecutionPolicy Bypass -File scripts/Download-Tessdata.ps1 -TessdataPath CharacterRecognition/tessdata -Language deu 43 | ``` 44 | 45 | Then update the `Language` property in `CharacterRecognition/appsettings.json` to match your chosen language code. 46 | 47 | Available language codes: `eng`, `deu`, `fra`, `spa`, `ita`, `por`, and [many more](https://github.com/tesseract-ocr/tessdata). 48 | 49 | ## Running the Application 50 | 51 | ```bash 52 | dotnet run --project CharacterRecognition/CharacterRecognition.csproj 53 | ``` 54 | 55 | Or open `OpenCV.sln` in Visual Studio and press F5. 56 | 57 | ## Usage 58 | 59 | 1. Start the application 60 | 2. Load one of the sample images from the **Assets** folder (these are invoice documents) 61 | 3. Click on **Analyze** and wait for the OCR task to complete 62 | 4. View the extracted text in the result window 63 | 64 | ![OCR Application in Action](img/pfandbeleg.png) 65 | 66 | ## Technical Details 67 | 68 | - **Framework**: .NET 10 69 | - **UI**: Windows Forms 70 | - **OCR Engine**: Tesseract 4 via EmguCV 4.12 71 | - **Architecture**: x64 72 | 73 | ## License 74 | 75 | [MIT](LICENSE) 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /CharacterRecognition/Forms/MainWnd.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Runtime.Versioning; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | using OcrApp.Services; 7 | 8 | namespace OcrApp.Forms 9 | { 10 | [SupportedOSPlatform("windows6.1")] 11 | public partial class MainWnd : Form 12 | { 13 | private readonly IOcrService ocrService; 14 | private string? path; 15 | 16 | public MainWnd(IOcrService ocrService) 17 | { 18 | InitializeComponent(); 19 | this.ocrService = ocrService; 20 | } 21 | 22 | private void loadImageToolStripMenuItem_Click(object sender, EventArgs e) 23 | { 24 | rtbOcrResult.Clear(); 25 | 26 | OpenFileDialog ofd = new OpenFileDialog(); 27 | ofd.Title = "Select an image"; 28 | ofd.Filter = "Image Files(*.png; *.jpg; *.bmp; *.gif)|*.png; *.jpg; *.bmp; *.gif"; 29 | if (ofd.ShowDialog() == DialogResult.OK) 30 | { 31 | path = System.IO.Path.GetFullPath(ofd.FileName); 32 | picBox.Image = new Bitmap(path); 33 | picBox.SizeMode = PictureBoxSizeMode.Zoom; 34 | statusLabelOCR.Text = path + " loaded."; 35 | } 36 | } 37 | 38 | private void exitToolStripMenuItem_Click(object sender, EventArgs e) 39 | { 40 | Close(); 41 | } 42 | 43 | private async void btnAnalyzeImage_Click(object sender, EventArgs e) 44 | { 45 | if(picBox.Image == null) 46 | { 47 | MessageBox.Show("Load an image first!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 48 | return; 49 | } 50 | 51 | statusLabelOCR.Text = "Analyzing invoice image..."; 52 | btnAnalyzeImage.Enabled = false; 53 | 54 | try 55 | { 56 | string result = await Task.Run(() => ocrService.ExtractText(path!)); 57 | rtbOcrResult.Text = result; 58 | statusLabelOCR.Text = "Analysis completed."; 59 | } 60 | catch (System.IO.FileNotFoundException ex) 61 | { 62 | MessageBox.Show($"Image file not found: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 63 | statusLabelOCR.Text = "Analysis failed."; 64 | } 65 | catch (Exception ex) 66 | { 67 | MessageBox.Show($"OCR processing failed: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 68 | statusLabelOCR.Text = "Analysis failed."; 69 | } 70 | finally 71 | { 72 | btnAnalyzeImage.Enabled = true; 73 | } 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /CharacterRecognition/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CharacterRecognition.Properties 12 | { 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// Returns the cached ResourceManager instance used by this class. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CharacterRecognition.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// Overrides the current thread's CurrentUICulture property for all 56 | /// resource lookups using this strongly typed resource class. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CharacterRecognition2.Properties 12 | { 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// Returns the cached ResourceManager instance used by this class. 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CharacterRecognition2.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// Overrides the current thread's CurrentUICulture property for all 56 | /// resource lookups using this strongly typed resource class. 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studo 2015 cache/options directory 26 | .vs/ 27 | 28 | # MSTest test Results 29 | [Tt]est[Rr]esult*/ 30 | [Bb]uild[Ll]og.* 31 | 32 | # NUNIT 33 | *.VisualState.xml 34 | TestResult.xml 35 | 36 | # Build Results of an ATL Project 37 | [Dd]ebugPS/ 38 | [Rr]eleasePS/ 39 | dlldata.c 40 | 41 | *_i.c 42 | *_p.c 43 | *_i.h 44 | *.ilk 45 | *.meta 46 | *.obj 47 | *.pch 48 | *.pdb 49 | *.pgc 50 | *.pgd 51 | *.rsp 52 | *.sbr 53 | *.tlb 54 | *.tli 55 | *.tlh 56 | *.tmp 57 | *.tmp_proj 58 | *.log 59 | *.vspscc 60 | *.vssscc 61 | .builds 62 | *.pidb 63 | *.svclog 64 | *.scc 65 | 66 | # Chutzpah Test files 67 | _Chutzpah* 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | *.cachefile 76 | 77 | # Visual Studio profiler 78 | *.psess 79 | *.vsp 80 | *.vspx 81 | 82 | # TFS 2012 Local Workspace 83 | $tf/ 84 | 85 | # Guidance Automation Toolkit 86 | *.gpState 87 | 88 | # ReSharper is a .NET coding add-in 89 | _ReSharper*/ 90 | *.[Rr]e[Ss]harper 91 | *.DotSettings.user 92 | 93 | # JustCode is a .NET coding addin-in 94 | .JustCode 95 | 96 | # TeamCity is a build add-in 97 | _TeamCity* 98 | 99 | # DotCover is a Code Coverage Tool 100 | *.dotCover 101 | 102 | # NCrunch 103 | _NCrunch_* 104 | .*crunch*.local.xml 105 | 106 | # MightyMoose 107 | *.mm.* 108 | AutoTest.Net/ 109 | 110 | # Web workbench (sass) 111 | .sass-cache/ 112 | 113 | # Installshield output folder 114 | [Ee]xpress/ 115 | 116 | # DocProject is a documentation generator add-in 117 | DocProject/buildhelp/ 118 | DocProject/Help/*.HxT 119 | DocProject/Help/*.HxC 120 | DocProject/Help/*.hhc 121 | DocProject/Help/*.hhk 122 | DocProject/Help/*.hhp 123 | DocProject/Help/Html2 124 | DocProject/Help/html 125 | 126 | # Click-Once directory 127 | publish/ 128 | 129 | # Publish Web Output 130 | *.[Pp]ublish.xml 131 | *.azurePubxml 132 | # TODO: Comment the next line if you want to checkin your web deploy settings 133 | # but database connection strings (with potential passwords) will be unencrypted 134 | *.pubxml 135 | *.publishproj 136 | 137 | # NuGet Packages 138 | *.nupkg 139 | # The packages folder can be ignored because of Package Restore 140 | **/packages/* 141 | # except build/, which is used as an MSBuild target. 142 | !**/packages/build/ 143 | # Uncomment if necessary however generally it will be regenerated when needed 144 | #!**/packages/repositories.config 145 | 146 | # Windows Azure Build Output 147 | csx/ 148 | *.build.csdef 149 | 150 | # Windows Store app package directory 151 | AppPackages/ 152 | 153 | # Others 154 | *.[Cc]ache 155 | ClientBin/ 156 | [Ss]tyle[Cc]op.* 157 | ~$* 158 | *~ 159 | *.dbmdl 160 | *.dbproj.schemaview 161 | *.pfx 162 | *.publishsettings 163 | node_modules/ 164 | bower_components/ 165 | 166 | # RIA/Silverlight projects 167 | Generated_Code/ 168 | 169 | # Backup & report files from converting an old project file 170 | # to a newer Visual Studio version. Backup files are not needed, 171 | # because we have git ;-) 172 | _UpgradeReport_Files/ 173 | Backup*/ 174 | UpgradeLog*.XML 175 | UpgradeLog*.htm 176 | 177 | # SQL Server files 178 | *.mdf 179 | *.ldf 180 | 181 | # Business Intelligence projects 182 | *.rdl.data 183 | *.bim.layout 184 | *.bim_*.settings 185 | 186 | # Microsoft Fakes 187 | FakesAssemblies/ 188 | 189 | # Node.js Tools for Visual Studio 190 | .ntvs_analysis.dat 191 | 192 | # Visual Studio 6 build log 193 | *.plg 194 | 195 | # Visual Studio 6 workspace options file 196 | *.opt 197 | 198 | scratchpad/ 199 | CharacterRecognition/tessdata/*.traineddata 200 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/MainWnd.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | using System.Windows.Forms; 11 | using System.Xml; 12 | using System.Runtime.Serialization; 13 | using System.Xml.Linq; 14 | using System.Xml.Serialization; 15 | using Emgu.CV; 16 | using Emgu.Util; 17 | using Emgu.CV.Structure; 18 | 19 | namespace CharacterRecognition2 20 | { 21 | //this is still in development...no real OCR for now. 22 | //just a few tests with images 23 | public partial class MainWnd : Form 24 | { 25 | private Image myImage; 26 | public MainWnd() 27 | { 28 | InitializeComponent(); 29 | } 30 | 31 | private void exitToolStripMenuItem_Click(object sender, EventArgs e) 32 | { 33 | Close(); 34 | } 35 | 36 | private void openToolStripMenuItem_Click(object sender, EventArgs e) 37 | { 38 | string filePath; 39 | OpenFileDialog ofd = new OpenFileDialog 40 | { 41 | Title = "Select an image", 42 | Filter = "Image Files(*.png; *.jpg; *.bmp; *.gif)|*.png; *.jpg; *.bmp; *.gif" 43 | }; 44 | if (ofd.ShowDialog() == DialogResult.OK) 45 | { 46 | filePath = System.IO.Path.GetFullPath(ofd.FileName); 47 | myImage = new Image(filePath); 48 | 49 | picBox.SizeMode = PictureBoxSizeMode.Zoom; 50 | picBox.Image = myImage.ToBitmap(); 51 | toolStripStatusLabel1.Text = ofd.FileName + " loaded."; 52 | } 53 | } 54 | 55 | private void btnToGray_Click(object sender, EventArgs e) 56 | { 57 | var gray = myImage.Convert().Convert(); 58 | picBox.Image = gray.ToBitmap(); 59 | } 60 | 61 | private void Reset_Click(object sender, EventArgs e) 62 | { 63 | if (myImage != null) 64 | { 65 | picBox.Image = myImage.ToBitmap(); 66 | } 67 | } 68 | 69 | private void button1_Click(object sender, EventArgs e) 70 | { 71 | if (myImage == null) 72 | { 73 | MessageBox.Show("No image available!", "Error", MessageBoxButtons.OK,MessageBoxIcon.Error); 74 | return; 75 | } 76 | var sfd = new SaveFileDialog 77 | { 78 | Title = "Serialize image to XML", 79 | Filter = "XML Files(*.xml)|*.xml" 80 | }; 81 | if (sfd.ShowDialog() == DialogResult.OK) 82 | { 83 | XmlSerializer ser = new XmlSerializer(typeof (Image)); 84 | 85 | using (var writer = XmlWriter.Create(sfd.FileName)) 86 | { 87 | ser.Serialize(writer, myImage); 88 | } 89 | toolStripStatusLabel1.Text = sfd.FileName + " saved."; 90 | } 91 | 92 | } 93 | 94 | private void openFromXMLToolStripMenuItem_Click(object sender, EventArgs e) 95 | { 96 | string filePath; 97 | OpenFileDialog ofd = new OpenFileDialog 98 | { 99 | Title = "Select an XML file", 100 | Filter = "XML Files(*.xml)|*.xml" 101 | }; 102 | if (ofd.ShowDialog() == DialogResult.OK) 103 | { 104 | filePath = System.IO.Path.GetFullPath(ofd.FileName); 105 | XmlSerializer ser = new XmlSerializer(typeof(Image)); 106 | 107 | using (XmlReader newReader = XmlReader.Create(new FileStream(filePath, FileMode.Open))) 108 | { 109 | Image image = ser.Deserialize(newReader) as Image; 110 | picBox.SizeMode = PictureBoxSizeMode.Zoom; 111 | picBox.Image = image.ToBitmap(); 112 | myImage = image; 113 | } 114 | toolStripStatusLabel1.Text = ofd.FileName + " loaded."; 115 | } 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /CharacterRecognition/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/CharacterRecognition2.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {DAA7FEFF-B3F1-402D-A37B-B0361AE0761D} 8 | WinExe 9 | Properties 10 | CharacterRecognition2 11 | CharacterRecognition2 12 | v4.6.1 13 | 512 14 | true 15 | 16 | 17 | x64 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | C:\bin\Emgu\bin\Emgu.CV.dll 38 | 39 | 40 | C:\bin\Emgu\bin\Emgu.CV.Contrib.dll 41 | 42 | 43 | C:\bin\Emgu\bin\Emgu.CV.ML.dll 44 | 45 | 46 | C:\bin\Emgu\bin\Emgu.CV.OCR.dll 47 | 48 | 49 | C:\bin\Emgu\bin\Emgu.CV.Shape.dll 50 | 51 | 52 | C:\bin\Emgu\bin\Emgu.CV.Stitching.dll 53 | 54 | 55 | C:\bin\Emgu\bin\Emgu.CV.Superres.dll 56 | 57 | 58 | C:\bin\Emgu\bin\Emgu.CV.UI.dll 59 | 60 | 61 | C:\bin\Emgu\bin\Emgu.CV.UI.GL.dll 62 | 63 | 64 | C:\bin\Emgu\bin\Emgu.CV.VideoStab.dll 65 | 66 | 67 | C:\bin\Emgu\bin\Emgu.Util.dll 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Form 85 | 86 | 87 | MainWnd.cs 88 | 89 | 90 | 91 | 92 | MainWnd.cs 93 | 94 | 95 | ResXFileCodeGenerator 96 | Resources.Designer.cs 97 | Designer 98 | 99 | 100 | True 101 | Resources.resx 102 | 103 | 104 | SettingsSingleFileGenerator 105 | Settings.Designer.cs 106 | 107 | 108 | True 109 | Settings.settings 110 | True 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 130 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/MainWnd.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 152, 17 125 | 126 | -------------------------------------------------------------------------------- /attic/CharacterRecognition2/MainWnd.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace CharacterRecognition2 2 | { 3 | partial class MainWnd 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.picBox = new System.Windows.Forms.PictureBox(); 32 | this.menuStrip1 = new System.Windows.Forms.MenuStrip(); 33 | this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 34 | this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 35 | this.openFromXMLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 36 | this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 37 | this.btnToGray = new System.Windows.Forms.Button(); 38 | this.Reset = new System.Windows.Forms.Button(); 39 | this.button1 = new System.Windows.Forms.Button(); 40 | this.statusStrip1 = new System.Windows.Forms.StatusStrip(); 41 | this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); 42 | ((System.ComponentModel.ISupportInitialize)(this.picBox)).BeginInit(); 43 | this.menuStrip1.SuspendLayout(); 44 | this.statusStrip1.SuspendLayout(); 45 | this.SuspendLayout(); 46 | // 47 | // picBox 48 | // 49 | this.picBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 50 | this.picBox.Location = new System.Drawing.Point(28, 46); 51 | this.picBox.Name = "picBox"; 52 | this.picBox.Size = new System.Drawing.Size(570, 481); 53 | this.picBox.TabIndex = 0; 54 | this.picBox.TabStop = false; 55 | // 56 | // menuStrip1 57 | // 58 | this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); 59 | this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 60 | this.fileToolStripMenuItem}); 61 | this.menuStrip1.Location = new System.Drawing.Point(0, 0); 62 | this.menuStrip1.Name = "menuStrip1"; 63 | this.menuStrip1.Size = new System.Drawing.Size(626, 28); 64 | this.menuStrip1.TabIndex = 1; 65 | this.menuStrip1.Text = "menuStrip1"; 66 | // 67 | // fileToolStripMenuItem 68 | // 69 | this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 70 | this.openToolStripMenuItem, 71 | this.openFromXMLToolStripMenuItem, 72 | this.exitToolStripMenuItem}); 73 | this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; 74 | this.fileToolStripMenuItem.Size = new System.Drawing.Size(44, 24); 75 | this.fileToolStripMenuItem.Text = "File"; 76 | // 77 | // openToolStripMenuItem 78 | // 79 | this.openToolStripMenuItem.Name = "openToolStripMenuItem"; 80 | this.openToolStripMenuItem.Size = new System.Drawing.Size(235, 26); 81 | this.openToolStripMenuItem.Text = "Open image"; 82 | this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); 83 | // 84 | // openFromXMLToolStripMenuItem 85 | // 86 | this.openFromXMLToolStripMenuItem.Name = "openFromXMLToolStripMenuItem"; 87 | this.openFromXMLToolStripMenuItem.Size = new System.Drawing.Size(235, 26); 88 | this.openFromXMLToolStripMenuItem.Text = "Open image from XML"; 89 | this.openFromXMLToolStripMenuItem.Click += new System.EventHandler(this.openFromXMLToolStripMenuItem_Click); 90 | // 91 | // exitToolStripMenuItem 92 | // 93 | this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; 94 | this.exitToolStripMenuItem.Size = new System.Drawing.Size(235, 26); 95 | this.exitToolStripMenuItem.Text = "Exit"; 96 | this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); 97 | // 98 | // btnToGray 99 | // 100 | this.btnToGray.Location = new System.Drawing.Point(28, 553); 101 | this.btnToGray.Name = "btnToGray"; 102 | this.btnToGray.Size = new System.Drawing.Size(87, 31); 103 | this.btnToGray.TabIndex = 2; 104 | this.btnToGray.Text = "to Gray"; 105 | this.btnToGray.UseVisualStyleBackColor = true; 106 | this.btnToGray.Click += new System.EventHandler(this.btnToGray_Click); 107 | // 108 | // Reset 109 | // 110 | this.Reset.Location = new System.Drawing.Point(511, 553); 111 | this.Reset.Name = "Reset"; 112 | this.Reset.Size = new System.Drawing.Size(87, 31); 113 | this.Reset.TabIndex = 3; 114 | this.Reset.Text = "Reset"; 115 | this.Reset.UseVisualStyleBackColor = true; 116 | this.Reset.Click += new System.EventHandler(this.Reset_Click); 117 | // 118 | // button1 119 | // 120 | this.button1.Location = new System.Drawing.Point(133, 553); 121 | this.button1.Name = "button1"; 122 | this.button1.Size = new System.Drawing.Size(87, 31); 123 | this.button1.TabIndex = 4; 124 | this.button1.Text = "to XML"; 125 | this.button1.UseVisualStyleBackColor = true; 126 | this.button1.Click += new System.EventHandler(this.button1_Click); 127 | // 128 | // statusStrip1 129 | // 130 | this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); 131 | this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 132 | this.toolStripStatusLabel1}); 133 | this.statusStrip1.Location = new System.Drawing.Point(0, 637); 134 | this.statusStrip1.Name = "statusStrip1"; 135 | this.statusStrip1.Size = new System.Drawing.Size(626, 25); 136 | this.statusStrip1.TabIndex = 5; 137 | this.statusStrip1.Text = "statusStrip1"; 138 | // 139 | // toolStripStatusLabel1 140 | // 141 | this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; 142 | this.toolStripStatusLabel1.Size = new System.Drawing.Size(50, 20); 143 | this.toolStripStatusLabel1.Text = "Ready"; 144 | // 145 | // MainWnd 146 | // 147 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 148 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 149 | this.ClientSize = new System.Drawing.Size(626, 662); 150 | this.Controls.Add(this.statusStrip1); 151 | this.Controls.Add(this.button1); 152 | this.Controls.Add(this.Reset); 153 | this.Controls.Add(this.btnToGray); 154 | this.Controls.Add(this.picBox); 155 | this.Controls.Add(this.menuStrip1); 156 | this.MainMenuStrip = this.menuStrip1; 157 | this.Name = "MainWnd"; 158 | this.Text = "Scan Simple"; 159 | ((System.ComponentModel.ISupportInitialize)(this.picBox)).EndInit(); 160 | this.menuStrip1.ResumeLayout(false); 161 | this.menuStrip1.PerformLayout(); 162 | this.statusStrip1.ResumeLayout(false); 163 | this.statusStrip1.PerformLayout(); 164 | this.ResumeLayout(false); 165 | this.PerformLayout(); 166 | 167 | } 168 | 169 | #endregion 170 | 171 | private System.Windows.Forms.PictureBox picBox; 172 | private System.Windows.Forms.MenuStrip menuStrip1; 173 | private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; 174 | private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; 175 | private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; 176 | private System.Windows.Forms.Button btnToGray; 177 | private System.Windows.Forms.Button Reset; 178 | private System.Windows.Forms.Button button1; 179 | private System.Windows.Forms.ToolStripMenuItem openFromXMLToolStripMenuItem; 180 | private System.Windows.Forms.StatusStrip statusStrip1; 181 | private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; 182 | } 183 | } 184 | 185 | -------------------------------------------------------------------------------- /CharacterRecognition/Forms/MainWnd.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace OcrApp.Forms 2 | { 3 | partial class MainWnd 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWnd)); 32 | this.menuStrip1 = new System.Windows.Forms.MenuStrip(); 33 | this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 34 | this.loadImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 35 | this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 36 | this.picBox = new System.Windows.Forms.PictureBox(); 37 | this.btnAnalyzeImage = new System.Windows.Forms.Button(); 38 | this.rtbOcrResult = new System.Windows.Forms.RichTextBox(); 39 | this.label1 = new System.Windows.Forms.Label(); 40 | this.label2 = new System.Windows.Forms.Label(); 41 | this.statusStripOCR = new System.Windows.Forms.StatusStrip(); 42 | this.statusLabelOCR = new System.Windows.Forms.ToolStripStatusLabel(); 43 | this.menuStrip1.SuspendLayout(); 44 | ((System.ComponentModel.ISupportInitialize)(this.picBox)).BeginInit(); 45 | this.statusStripOCR.SuspendLayout(); 46 | this.SuspendLayout(); 47 | // 48 | // menuStrip1 49 | // 50 | this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); 51 | this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 52 | this.fileToolStripMenuItem}); 53 | this.menuStrip1.Location = new System.Drawing.Point(0, 0); 54 | this.menuStrip1.Name = "menuStrip1"; 55 | this.menuStrip1.Size = new System.Drawing.Size(1045, 28); 56 | this.menuStrip1.TabIndex = 0; 57 | this.menuStrip1.Text = "menuStrip1"; 58 | // 59 | // fileToolStripMenuItem 60 | // 61 | this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 62 | this.loadImageToolStripMenuItem, 63 | this.exitToolStripMenuItem}); 64 | this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; 65 | this.fileToolStripMenuItem.Size = new System.Drawing.Size(44, 24); 66 | this.fileToolStripMenuItem.Text = "File"; 67 | // 68 | // loadImageToolStripMenuItem 69 | // 70 | this.loadImageToolStripMenuItem.Name = "loadImageToolStripMenuItem"; 71 | this.loadImageToolStripMenuItem.Size = new System.Drawing.Size(163, 26); 72 | this.loadImageToolStripMenuItem.Text = "Load Image"; 73 | this.loadImageToolStripMenuItem.Click += new System.EventHandler(this.loadImageToolStripMenuItem_Click); 74 | // 75 | // exitToolStripMenuItem 76 | // 77 | this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; 78 | this.exitToolStripMenuItem.Size = new System.Drawing.Size(163, 26); 79 | this.exitToolStripMenuItem.Text = "Exit"; 80 | this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); 81 | // 82 | // picBox 83 | // 84 | this.picBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 85 | this.picBox.Location = new System.Drawing.Point(12, 61); 86 | this.picBox.Name = "picBox"; 87 | this.picBox.Size = new System.Drawing.Size(565, 529); 88 | this.picBox.TabIndex = 1; 89 | this.picBox.TabStop = false; 90 | // 91 | // btnAnalyzeImage 92 | // 93 | this.btnAnalyzeImage.Location = new System.Drawing.Point(912, 609); 94 | this.btnAnalyzeImage.Name = "btnAnalyzeImage"; 95 | this.btnAnalyzeImage.Size = new System.Drawing.Size(121, 34); 96 | this.btnAnalyzeImage.TabIndex = 2; 97 | this.btnAnalyzeImage.Text = "Analyze"; 98 | this.btnAnalyzeImage.UseVisualStyleBackColor = true; 99 | this.btnAnalyzeImage.Click += new System.EventHandler(this.btnAnalyzeImage_Click); 100 | // 101 | // rtbOcrResult 102 | // 103 | this.rtbOcrResult.Font = new System.Drawing.Font("Arial Narrow", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 104 | this.rtbOcrResult.Location = new System.Drawing.Point(583, 61); 105 | this.rtbOcrResult.Name = "rtbOcrResult"; 106 | this.rtbOcrResult.Size = new System.Drawing.Size(450, 529); 107 | this.rtbOcrResult.TabIndex = 3; 108 | this.rtbOcrResult.Text = ""; 109 | // 110 | // label1 111 | // 112 | this.label1.AutoSize = true; 113 | this.label1.Location = new System.Drawing.Point(583, 31); 114 | this.label1.Name = "label1"; 115 | this.label1.Size = new System.Drawing.Size(48, 17); 116 | this.label1.TabIndex = 4; 117 | this.label1.Text = "Result"; 118 | // 119 | // label2 120 | // 121 | this.label2.AutoSize = true; 122 | this.label2.Location = new System.Drawing.Point(12, 31); 123 | this.label2.Name = "label2"; 124 | this.label2.Size = new System.Drawing.Size(52, 17); 125 | this.label2.TabIndex = 5; 126 | this.label2.Text = "Invoice"; 127 | // 128 | // statusStripOCR 129 | // 130 | this.statusStripOCR.ImageScalingSize = new System.Drawing.Size(20, 20); 131 | this.statusStripOCR.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 132 | this.statusLabelOCR}); 133 | this.statusStripOCR.Location = new System.Drawing.Point(0, 653); 134 | this.statusStripOCR.Name = "statusStripOCR"; 135 | this.statusStripOCR.Size = new System.Drawing.Size(1045, 25); 136 | this.statusStripOCR.TabIndex = 6; 137 | this.statusStripOCR.Text = "Ready"; 138 | // 139 | // statusLabelOCR 140 | // 141 | this.statusLabelOCR.Name = "statusLabelOCR"; 142 | this.statusLabelOCR.Size = new System.Drawing.Size(50, 20); 143 | this.statusLabelOCR.Text = "Ready"; 144 | // 145 | // MainWnd 146 | // 147 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 148 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 149 | this.ClientSize = new System.Drawing.Size(1045, 678); 150 | this.Controls.Add(this.statusStripOCR); 151 | this.Controls.Add(this.label2); 152 | this.Controls.Add(this.label1); 153 | this.Controls.Add(this.rtbOcrResult); 154 | this.Controls.Add(this.btnAnalyzeImage); 155 | this.Controls.Add(this.picBox); 156 | this.Controls.Add(this.menuStrip1); 157 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 158 | this.MainMenuStrip = this.menuStrip1; 159 | this.MaximizeBox = false; 160 | this.Name = "MainWnd"; 161 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 162 | this.Text = "Character Recognition"; 163 | this.menuStrip1.ResumeLayout(false); 164 | this.menuStrip1.PerformLayout(); 165 | ((System.ComponentModel.ISupportInitialize)(this.picBox)).EndInit(); 166 | this.statusStripOCR.ResumeLayout(false); 167 | this.statusStripOCR.PerformLayout(); 168 | this.ResumeLayout(false); 169 | this.PerformLayout(); 170 | 171 | } 172 | 173 | #endregion 174 | 175 | private System.Windows.Forms.MenuStrip menuStrip1; 176 | private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; 177 | private System.Windows.Forms.ToolStripMenuItem loadImageToolStripMenuItem; 178 | private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; 179 | private System.Windows.Forms.PictureBox picBox; 180 | private System.Windows.Forms.Button btnAnalyzeImage; 181 | private System.Windows.Forms.RichTextBox rtbOcrResult; 182 | private System.Windows.Forms.Label label1; 183 | private System.Windows.Forms.Label label2; 184 | private System.Windows.Forms.StatusStrip statusStripOCR; 185 | private System.Windows.Forms.ToolStripStatusLabel statusLabelOCR; 186 | } 187 | } 188 | 189 | -------------------------------------------------------------------------------- /CharacterRecognition/Forms/MainWnd.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 17, 17 122 | 123 | 124 | 152, 17 125 | 126 | 127 | 128 | 129 | AAABAAEAKCgAAAEAGAAoFAAAFgAAACgAAAAoAAAAUAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 130 | AAD///////////////////////////////////////////////////////////////////////////// 131 | //////////////////////////////////////////////////////////////////////////////// 132 | //////////////////////////////////////////////////////////////////////////////// 133 | //////////////////////////////////////////////////////////////////////////////// 134 | //////////////////////////////////////////////////////////////////////////////// 135 | //////////////////////////////////////////////////////////////////////////////// 136 | //////////////////////////////////////////////////////////////////////////////// 137 | //////////////////////////////////////////////////////////////////////////////// 138 | //////////////////////////////////////////////////////////////////////////////// 139 | //////////////////////////////////////////////////////////////////////////////// 140 | //////////////////////////////////////////////////////////////////////////////// 141 | //////////////////////////////////////////////////////////////////////////////// 142 | ///////////////////////////////////////////////////////////////////u9P3I2/iqx/Sb 143 | vfKev/KyzfXU4/n6/P7////////////////////////6/P/3+v/9/v////////////////////////// 144 | ///////////////////////////////////////////////////////////S4fl8qO5BgeYmb+IeauEe 145 | auEeauEfa+Esc+NQi+iXuvHq8fz///////////////+Pv/hYn/XY6fz///////////////////////// 146 | ///////////////////////////////////////////////////09/6Fr+8vduMeauE6fOVom+uNtPCf 147 | wPKcvfKDre5ZkektdOMeauFCguauyfT///////////9+tPc9j/PS5fz///////////////////////// 148 | ///////////////////////////////////////////////k7fxZkekeauE8fuWXuvHk7fz///////// 149 | ///////////9/v/R4Pl3pe0qcuMlb+KGr+/3+v7///+BtvdCkvPT5vz///////////////////////// 150 | ///////////////////////////////////////////p8PxQi+gfa+Fhl+rf6vv///////////////// 151 | //////////////////////+80/Y/gOUfa+HA1vf///+BtvdCkvPT5vz///////////////////////// 152 | ///////////////////////////////////////6/P9lmeseauFsnuv2+f7///////////////////// 153 | ///////////////////////////W5Po5fOS1zvX///+BtvdCkvPT5vz///////////////////////// 154 | //////////////////////////////////////+fwPIga+FVjunz9/7///////////////////////// 155 | ///////////////////////////////C1/e+1Pf///+BtvdCkvPT5vz///////////////////////// 156 | ///////////////////////////////////q8fw+gOYvdePR4fn///////////////////////////// 157 | ///////////////////////////////////6/P////+BtvdCkvPT5vz///////////////////////// 158 | //////////////////////////////////+bvfIdauF8qe7///////////////////////////////// 159 | //////////////////////////////////////////+BtvdCkvPT5vz///////////////////////// 160 | ///////////////////////////////8/f9Wj+grcuPR4fn///////////////////////////////// 161 | //////////////////////////////////////////+BtvdCkvPT5vz///////////////////////// 162 | ///////////////////////////////c6PovduNTjej8/f////////////////////////////////// 163 | //////////////////////////////////////////+BtvdCkvPT5vz///////////////////////// 164 | //////////////////////////////+30PYga+F/qu7///////////////////////////////////// 165 | //////////////////////////////////////////+BtvdCkvPT5vz///////////////////////// 166 | //////////////////////////////+cvvIdauGdv/L///////////////////////////////////// 167 | //////////////////////////////////////////+BtvdCkvPT5vz///////////////////////// 168 | //////////////////////////////+PtfAeauGsyPT///////////////////////////////////// 169 | //////////////////////////////////////////+BtvdCkvPT5vz///////////////////////// 170 | //////////////////////////////+QtvAeauGqx/T///////////////////////////////////// 171 | //////////////////////////////////////////+AtvdDk/PV5/3///////////////////////// 172 | //////////////////////////////+gwPMdauGavPL///////////////////////////////////// 173 | //////////////////////////////////////////+AtvdIlvTg7f3///////////////////////// 174 | //////////////////////////////+80/YhbOJ4pu3///////////////////////////////////// 175 | //////////////////////////////////////////9+tfdUnPTy+P////////////////////////// 176 | ///////////////////////////////i7Ps0eeRMiOf4+/7///////////////////////////////// 177 | //////////////////////////////////////////95svdwrfb///////////////////////////// 178 | ///////////////////////////////+/v9fleomb+LG2fj///////////////////////////////// 179 | //////////////////////////////////////////92sPehyfn///////////////////////////// 180 | //////////////////////////////////+pxvQfa+Fun+z///////////////////////////////// 181 | //////////////////////////////////////////+EuPje7P3///////////////////////////// 182 | ///////////////////////////////////z9/5Jh+coceK/1ff///////////////////////////// 183 | ///////////////////////////////////0+P7+/v/E3fz///////////////////////////////// 184 | //////////////////////////////////////+yzfUkbuJFhObm7vz///////////////////////// 185 | //////////////////////////////+syPS30Pb///////////////////////////////////////// 186 | //////////////////////////////////////////97p+4eauFWj+jn7/z///////////////////// 187 | //////////////////////////+/1fcsdOO2z/X///////////////////////////////////////// 188 | ///////////////////////////////////////////1+f5lmeseauFLiOfG2vj///////////////// 189 | ///////////////////8/f+fwPIwduQlb+LH2vj///////////////////////////////////////// 190 | ///////////////////////////////////////////////z9/5youwhbOItdON5pu3L3fj3+v7///// 191 | ///////////t8/20zvVck+kibeIvdeOiwvP9/v////////////////////////////////////////// 192 | //////////////////////////////////////////////////////+kw/NAgeYeauEqcuNNiedun+yA 193 | q+58qO5lmepBgeYibeIjbeJZkenK3Pj///////////////////////////////////////////////// 194 | ///////////////////////////////////////////////////////////p8fybvfJZkek1eeQlb+Ih 195 | bOEibeEpceI9f+Vrneu2z/X7/P////////////////////////////////////////////////////// 196 | ///////////////////////////////////////////////////////////////////+///i7PvJ2/i7 197 | 0va91PbQ4Pns8/3///////////////////////////////////////////////////////////////// 198 | //////////////////////////////////////////////////////////////////////////////// 199 | //////////////////////////////////////////////////////////////////////////////// 200 | //////////////////////////////////////////////////////////////////////////////// 201 | //////////////////////////////////////////////////////////////////////////////// 202 | //////////////////////////////////////////////////////////////////////////////// 203 | //////////////////////////////////////////////////////////////////////////////// 204 | //////////////////////////////////////////////////////////////////////////////// 205 | //////////////////////////////////////////////////////////////////////////////// 206 | //////////////////////////////////////////////////////////////////////////////// 207 | //////////////////////////////////////////////////////////////////////////////// 208 | //////////////////////////////////////////////////////////////////////////////// 209 | //////////////////////////////////////////////////////////////////////////////// 210 | //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 211 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 212 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 213 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 214 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 215 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== 216 | 217 | 218 | --------------------------------------------------------------------------------