Windows 앱 SDK 텍스트 인식
Windows 앱 SDK 함께 제공되는 새로운 AI(인공 지능) 텍스트 인식 API를 사용하여 이미지의 문자를 식별하고, 단어, 선, 다각형 경계를 인식하고, 생성된 일치 항목에 대한 신뢰 수준을 제공할 수 있습니다.
이러한 새로운 Windows 앱 SDK API는 Windows 플랫폼 SDK의 레거시 Windows.Media.Ocr.OcrEngine API보다 빠르고 정확하며 NPU(신경 처리 장치)를 사용하는 디바이스에서 하드웨어 가속을 지원합니다.
Important
Windows 앱 SDK 실험 채널에는 개발 초기 단계의 API 및 기능이 포함됩니다. 실험적 채널의 모든 API는 광범위한 수정 및 호환성이 손상되는 변경이 적용되며 언제든지 후속 릴리스에서 제거될 수 있습니다. 프로덕션 환경에서는 사용할 수 없으며 실험적 기능을 사용하는 앱은 Microsoft Store에 게시할 수 없습니다.
필수 조건
Windows 앱 SDK 및 AI 텍스트 인식으로 무엇을 할 수 있나요?
Windows 앱 SDK 새로운 AI 텍스트 인식 기능을 사용하여 이미지의 텍스트를 식별하고 인식합니다. 인식된 텍스트의 텍스트 경계 및 신뢰도 점수를 가져올 수도 있습니다.
파일에서 ImageBuffer 만들기
이 예제에서는 이미지 파일에서 ImageBuffer를 가져오는 함수를 호출 LoadImageBufferFromFileAsync
합니다.
LoadImageBufferFromFileAsync 함수에서 다음 단계를 완료합니다.
- 지정된 파일 경로에서 StorageFile 개체를 만듭니다.
- OpenAsync를 사용하여 StorageFile에서 스트림을 엽니다.
- 스트림에 대한 BitmapDecoder 를 만듭니다.
- 비트맵 디코더에서 GetSoftwareBitmapAsync를 호출하여 SoftwareBitmap 개체를 가져옵니다.
- CreateBufferAttachedToBitmap에서 이미지 버퍼를 반환합니다.
namespace winrt
{
using namespace Microsoft::Windows::AI::Imaging;
using namespace Windows::Graphics::Imaging;
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
}
winrt::IAsyncOperation<winrt::ImageBuffer> LoadImageBufferFromFileAsync(
const std::wstring& filePath)
{
auto file = co_await winrt::StorageFile::GetFileFromPathAsync(filePath);
auto stream = co_await file.OpenAsync(winrt::FileAccessMode::Read);
auto decoder = co_await winrt::BitmapDecoder::CreateAsync(stream);
auto bitmap = co_await decoder.GetSoftwareBitmapAsync();
if (bitmap == nullptr) {
co_return nullptr;
}
co_return winrt::ImageBuffer::CreateBufferAttachedToBitmap(bitmap);
}
비트맵 이미지에서 텍스트 인식
다음 예제에서는 SoftwareBitmap 개체의 일부 텍스트를 단일 문자열 값으로 인식하는 방법을 보여줍니다.
- 함수 호출을 통해 TextRecognizer 개체를
EnsureModelIsReady
만듭니다. 이 개체는 시스템에 언어 모델이 있는지도 확인합니다. - 이전 코드 조각에서 가져온 비트맵을 사용하여 함수를 호출합니다
RecognizeTextFromSoftwareBitmap
. - 이미지 파일에서 CreateBufferAttachedToBitmap을 호출하여 ImageBuffer 개체를 가져옵니다.
- RecognizeTextFromImage를 호출하여 ImageBuffer에서 인식된 텍스트를 가져옵니다.
- wstringstream 개체를 만들고 인식된 텍스트와 함께 로드합니다.
- 문자열을 반환합니다.
참고 항목
이 EnsureModelIsReady
함수는 텍스트 인식 모델의 준비 상태를 확인하고 필요한 경우 설치하는 데 사용됩니다.
namespace winrt
{
using namespace Microsoft::Windows::Imaging;
using namespace Microsoft::Windows::Vision;
using namespace Windows::Graphics::Imaging;
}
winrt::IAsyncOperation<winrt::TextRecognizer> EnsureModelIsReady();
winrt::IAsyncOperation<winrt::hstring> RecognizeTextFromSoftwareBitmap(winrt::SoftwareBitmap const& bitmap)
{
winrt::TextRecognizer textRecognizer = co_await EnsureModelIsReady();
winrt::ImageBuffer imageBuffer = winrt::ImageBuffer::CreateBufferAttachedToBitmap(bitmap);
winrt::RecognizedText recognizedText = textRecognizer.RecognizeTextFromImage(imageBuffer);
std::wstringstream stringStream;
for (const auto& line : recognizedText.Lines())
{
stringStream << line.Text().c_str() << std::endl;
}
co_return winrt::hstring{stringStream.view()};
}
winrt::IAsyncOperation<winrt::TextRecognizer> EnsureModelIsReady()
{
if (!winrt::TextRecognizer::IsAvailable())
{
auto loadResult = co_await winrt::TextRecognizer::MakeAvailableAsync();
if (loadResult.Status() != winrt::PackageDeploymentStatus::CompletedSuccess)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
co_return winrt::TextRecognizer::CreateAsync();
}
단어 경계 및 신뢰도 가져오기
여기서는 SoftwareBitmap 개체에 있는 각 단어의 BoundingBox를 Grid 요소의 색으로 구분된 다각형 컬렉션으로 시각화하는 방법을 보여 줍니다.
참고 항목
이 예제에서는 TextRecognizer 개체가 이미 만들어지고 함수에 전달되었다고 가정합니다.
namespace winrt
{
using namespace Microsoft::Windows::Imaging;
using namespace Microsoft::Windows::Vision;
using namespace Micrsooft::Windows::UI::Xaml::Controls;
using namespace Micrsooft::Windows::UI::Xaml::Media;
using namespace Micrsooft::Windows::UI::Xaml::Shapes;
}
void VisualizeWordBoundariesOnGrid(
winrt::SoftwareBitmap const& bitmap,
winrt::Grid const& grid,
winrt::TextRecognizer const& textRecognizer)
{
winrt::ImageBuffer imageBuffer = winrt::ImageBuffer::CreateBufferAttachedToBitmap(bitmap);
winrt::RecognizedText result = textRecognizer.RecognizeTextFromImage(imageBuffer);
auto greenBrush = winrt::SolidColorBrush(winrt::Microsoft::UI::Colors::Green);
auto yellowBrush = winrt::SolidColorBrush(winrt::Microsoft::UI::Colors::Yellow);
auto redBrush = winrt::SolidColorBrush(winrt::Microsoft::UI::Colors::Red);
for (const auto& line : recognizedText.Lines())
{
for (const auto& word : line.Words())
{
winrt::PointCollection points;
const auto& bounds = word.BoundingBox();
points.Append(bounds.TopLeft);
points.Append(bounds.TopRight);
points.Append(bounds.BottomRight);
points.Append(bounds.BottomLeft);
winrt::Polygon polygon;
polygon.Points(points);
polygon.StrokeThickness(2);
if (word.Confidence() < 0.33)
{
polygon.Stroke(redBrush);
}
else if (word.Confidence() < 0.67)
{
polygon.Stroke(yellowBrush);
}
else
{
polygon.Stroke(greenBrush);
}
grid.Children().Add(polygon);
}
}
}
추가 리소스
Windows App SDK 및 WinRT API를 사용하여 파일 및 폴더에 액세스
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기