├── 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 | 
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 |
--------------------------------------------------------------------------------