C# - Windows.Media.Ocr: 윈도우 운영체제에 포함된 OCR(Optical Character Recognition)
이것도 역시 WinRT API로 제공하고 있기 때문에 프로젝트의 TargetFramework 설정을 먼저 변경해야만,
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows10.0.17763.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
OCR 관련 API를 사용할 수 있습니다.
// Windows.Media.Ocr Namespace
// https://learn.microsoft.com/en-us/uwp/api/windows.media.ocr?view=winrt-22621
// Optical Character Recognition (OCR) for Windows 10
// https://blogs.windows.com/windowsdeveloper/2016/02/08/optical-character-recognition-ocr-for-windows-10/
using Windows.Media.Ocr;
namespace ConsoleApp1;
internal class Program
{
static void Main(string[] args)
{
InitializeOcrLanguages();
}
private static void InitializeOcrLanguages()
{
try
{
var supportedLanguages = OcrEngine.AvailableRecognizerLanguages;
foreach (var language in supportedLanguages)
{
Console.WriteLine($"{language.DisplayName} ({language.LanguageTag})");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error initializing OCR languages: {ex.Message}");
}
}
}
/* 출력 결과:
English (United States) (en-US)
Korean (ko) (ko)
*/
제 컴퓨터에서는 2개의 OCR 언어가 지원된다고 나오는데요, 왜냐하면 Windows Settings에서
해당 구성 요소를 설치했기 때문입니다.
참고로, 자신의 시스템에 설치된 언어와 그것의 OCR 지원 여부를 다음의 PowerShell 명령어로도 확인할 수 있습니다.
// Query for OCR language packs
// ; https://learn.microsoft.com/en-us/windows/powertoys/text-extractor#query-for-ocr-language-packs
// 관리자 권한으로 PowerShell 실행
PS C:\Windows\System32> Get-WindowsCapability -Online | Where-Object { $_.Name -Like 'Language.OCR*' }
...[생략]...
Name : Language.OCR~~~en-US~0.0.1.0
State : Installed
...[생략]...
Name : Language.OCR~~~ko-KR~0.0.1.0
State : Installed
...[생략]...
그다음 원하는 언어로 OCR 엔진을 초기화한 후,
var languageTag = new Windows.Globalization.Language("ko");
var ocrEngine = OcrEngine.TryCreateFromLanguage(languageTag);
if (ocrEngine == null)
{
Console.WriteLine($"OCR engine could not be created for language: {languageTag}");
return;
}
Console.WriteLine();
Console.WriteLine($"OCR engine created for language: {ocrEngine.RecognizerLanguage.DisplayName}");
SoftwareBitmap 개체를 OCR 엔진에 전달하면 텍스트를 인식할 수 있습니다.
var softwareBitmap = await ImageFromPath("test_img.png");
var ocrResult = await ocrEngine.RecognizeAsync(softwareBitmap);
Console.WriteLine(ocrResult.Text); // 인식한 텍스트 출력
// https://stackoverflow.com/questions/56469760/convert-a-system-drawing-bitmap-to-windows-graphics-imaging-softwarebitmap
private static async Task<SoftwareBitmap> ImageFromPath(string path)
{
using var bitmap = new System.Drawing.Bitmap(path);
using (var stream
= new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
bitmap.Save(stream.AsStream(), ImageFormat.Jpeg);
Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream);
return await decoder.GetSoftwareBitmapAsync();
}
}
간단하죠? ^^ 하지만 윈도우 운영체제에 (무료) 포함된 기능인만큼 다소 실망스러운 부분이 있는데요, 인식률이 과히 좋은 편은 아닙니다. 그러니까... 예전 "음성인식(SpeechRecognizer)" 기능이 그랬던 것처럼,
C# - Windows 10 운영체제의 데스크톱 앱에서 음성인식(SpeechRecognizer) 사용하는 방법
; https://www.sysnet.pe.kr/2/0/11420
재미 삼아 사용해 볼 정도입니다. (혹시나
GrayScale, Canny 등의 전처리를 하면 조금 나아질지는 모르겠습니다. ^^)
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
아래의 글을 보면,
Window Media OCR library For OCR
; https://codefrydev.in/Updates/application/ocr/window-media-ocr/
Windows의 PowerToys에 포함된 "Text Extractor" 유틸리티 소스 코드를 사용한 라이브러리도 공개하고 있는데요,
git clone https://github.com/codefrydev/OCR.git
하지만, 결국 그것도 Windows.Media.Ocr을 사용하고 있으므로 이 글의 내용과 크게 다르진 않습니다. (달리 말하면, Windows Media OCR의 인식률 테스트를 "Text Extractor"로도 할 수 있습니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]