Začínáme s rozpoznáváním textu (OCR) v sadě Windows App SDK
Důležitý
Tato funkce ještě není k dispozici. Očekává se, že v nadcházejícím vydání sady Windows App SDK v experimentálním kanálu bude uvedena.
Sada Windows App SDK v experimentálním kanálu zahrnuje rozhraní API a funkce v raných fázích vývoje. Všechna rozhraní API v experimentálním kanálu podléhají rozsáhlým revizem a zásadním změnám a je možné je kdykoli odebrat z následujících verzí. Nejsou podporovány pro použití v produkčních prostředích a aplikace, které používají experimentální funkce, nelze publikovat do Microsoft Storu.
Rozpoznávání textu, označované také jako optické rozpoznávání znaků (OCR), bude podporováno Windows App SDK prostřednictvím sady rozhraní API využívajících umělou inteligenci (AI), která můžou rozpoznat a extrahovat text v obrázcích a převést ho na strojově čitelné datové proudy znaků.
Tato rozhraní API můžou identifikovat znaky, slova, řádky, mnohoúhelníkové hranice textu a poskytovat úrovně spolehlivosti pro každou shodu. Jsou také podporovány pouze hardwarovou akcelerací v zařízeních s neurální zpracovatelskou jednotkou (NPU), což je činí rychlejšími a přesnějšími než starší rozhraní Windows.Media.Ocr.OcrEngine API v Windows Platform SDK.
Podrobnosti o rozhraní API najdete v tématu referenční informace k rozhraní API pro rozpoznávání textu založené na umělé inteligenci (OCR) vsady Windows App SDK .
Spropitné
Poskytněte zpětnou vazbu k těmto rozhraním API a jejich funkcím vytvořením nového problému v úložišti GitHub sady Windows App SDK. (
Požadavky
- Počítače CoPilot+ obsahující procesor Qualcomm Snapdragon® X Elite.
Co můžu dělat se sadou Windows App SDK a rozpoznáváním textu AI?
Pomocí nových funkcí rozpoznávání textu AI v sadě Windows App SDK můžete identifikovat a rozpoznat text na obrázku. Můžete také získat hranice textu a skóre spolehlivosti pro rozpoznaný text.
Vytvoření imageBufferu ze souboru
V tomto příkladu voláme funkci LoadImageBufferFromFileAsync
pro získání ImageBuffer ze souboru obrázku.
Ve funkci LoadImageBufferFromFileAsync provedeme následující kroky:
- Ze zadané cesty k souboru vytvořte objekt StorageFile.
- Pomocí openAsyncotevřete datový proud v souboru StorageFile.
- Vytvořte BitmapDecoder pro datový proud.
- Zavolejte GetSoftwareBitmapAsync na rastrovém dekodéru pro získání objektu SoftwareBitmap.
- ```Vrátit vyrovnávací paměť obrazu z CreateBufferAttachedToBitmap.```
using Microsoft.Windows.Vision;
using Microsoft.Windows.Imaging;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
public async Task<ImageBuffer> LoadImageBufferFromFileAsync(string filePath)
{
StorageFile file = await StorageFile.GetFileFromPathAsync(filePath);
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
SoftwareBitmap bitmap = await decoder.GetSoftwareBitmapAsync();
if (bitmap == null)
{
return null;
}
return ImageBuffer.CreateBufferAttachedToBitmap(bitmap);
}
namespace winrt
{
using namespace Microsoft::Windows::Vision;
using namespace Microsoft::Windows::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);
}
Rozpoznávání textu v rastrovém obrázku
Následující příklad ukazuje, jak rozpoznat nějaký text v objektu SoftwareBitmap jako jednu řetězcovou hodnotu:
- Vytvořte objekt TextRecognizer prostřednictvím volání funkce
EnsureModelIsReady
, která také potvrzuje, že v systému existuje jazykový model. - Pomocí rastrového obrázku získaného v předchozím fragmentu kódu voláme funkci
RecognizeTextFromSoftwareBitmap
. - Voláním CreateBufferAttachedToBitmap v souboru obrázku získejte objekt ImageBuffer.
- Zavolejte RecognizeTextFromImage pro získání rozpoznaného textu z ImageBuffer.
- Vytvořte objekt wstringstream a naplňte ho rozpoznaným textem.
- Vrať řetězec.
Poznámka
Funkce EnsureModelIsReady
slouží ke kontrole stavu připravenosti modelu rozpoznávání textu (a v případě potřeby ji nainstalujte).
using Microsoft.Windows.Vision;
using Microsoft.Windows.Imaging;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
public async Task<string> RecognizeTextFromSoftwareBitmap(SoftwareBitmap bitmap)
{
TextRecognizer textRecognizer = await EnsureModelIsReady();
ImageBuffer imageBuffer = ImageBuffer.CreateBufferAttachedToBitmap(bitmap);
RecognizedText recognizedText = textRecognizer.RecognizeTextFromImage(imageBuffer);
StringBuilder stringBuilder = new StringBuilder();
foreach (var line in recognizedText.Lines)
{
stringBuilder.AppendLine(line.Text);
}
return stringBuilder.ToString();
}
public async Task<TextRecognizer> EnsureModelIsReady()
{
if (!TextRecognizer.IsAvailable())
{
var loadResult = await TextRecognizer.MakeAvailableAsync();
if (loadResult.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw new Exception(loadResult.ExtendedError().Message);
}
}
return await TextRecognizer.CreateAsync();
}
namespace winrt
{
using namespace Microsoft::Windows::Vision;
using namespace Microsoft::Windows::Imaging;
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();
}
Získejte slovní hranice a spolehlivost
Zde si ukážeme, jak vizualizovat BoundingBox každého slova v objektu SoftwareBitmap jako kolekci barevně kódovaných mnohoúhelníků na elementu mřížka.
Poznámka
V tomto příkladu předpokládáme, že TextRecognizer objekt již byl vytvořen a předán funkci.
using Microsoft.Windows.Vision;
using Microsoft.Windows.Imaging;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
public void VisualizeWordBoundariesOnGrid(
SoftwareBitmap bitmap,
Grid grid,
TextRecognizer textRecognizer)
{
ImageBuffer imageBuffer = ImageBuffer.CreateBufferAttachedToBitmap(bitmap);
RecognizedText result = textRecognizer.RecognizeTextFromImage(imageBuffer);
SolidColorBrush greenBrush = new SolidColorBrush(Microsoft.UI.Colors.Green);
SolidColorBrush yellowBrush = new SolidColorBrush(Microsoft.UI.Colors.Yellow);
SolidColorBrush redBrush = new SolidColorBrush(Microsoft.UI.Colors.Red);
foreach (var line in result.Lines)
{
foreach (var word in line.Words)
{
PointCollection points = new PointCollection();
var bounds = word.BoundingBox;
points.Add(bounds.TopLeft);
points.Add(bounds.TopRight);
points.Add(bounds.BottomRight);
points.Add(bounds.BottomLeft);
Polygon polygon = new 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);
}
}
}
namespace winrt
{
using namespace Microsoft::Windows::Vision;
using namespace Microsoft::Windows::Imaging;
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);
}
}
}
Další zdroje informací
Přístup k souborům a složkám pomocí sady Windows App SDK a rozhraní API WinRT