Az AI Text Recognition (OCR) használatának első lépései a Windows App SDK-ban
Fontos
Elérhető a Windows App SDK legújabb kísérleti csatornáján kiadásában.
A Windows App SDK kísérleti csatornája api-kat és funkciókat tartalmaz a fejlesztés korai szakaszában. A kísérleti csatornán található összes API-ra kiterjedt változatok és kompatibilitástörő változások vonatkoznak, és bármikor eltávolíthatók a későbbi kiadásokból. A kísérleti funkciók nem használhatók éles környezetben, és az őket használó alkalmazások nem tehetők közzé a Microsoft Store-ban.
- Az önálló alkalmazások nem támogatottak.
A szövegfelismerést, más néven optikai karakterfelismerést (OCR) a Windows App SDK mesterséges intelligencia (AI) által támogatott API-k segítségével támogatja, amelyek képesek a képeken belüli szöveg észlelésére és kinyerésére, valamint gépi olvasható karakterfolyamokká alakítására.
Ezek az API-k azonosítják a karaktereket, szavakat, vonalakat, sokszögletű szöveghatárokat, és megbízhatósági szinteket biztosítanak az egyes egyezésekhez. Emellett kizárólag a neurális feldolgozóegységekkel (NPU) rendelkező eszközök hardveres gyorsítása támogatja őket, így gyorsabbak és pontosabbak, mint az örökölt Windows.Media.Ocr.OcrEngine API-k a Windows platform SDK.
Az API részleteiértlásd a Szövegfelismerés (OCR) API-hivatkozást a Windows App SDK oldalán.
Borravaló
Küldjön visszajelzést ezekről az API-król és funkcióikról egy új probléma létrehozásával a Windows App SDK GitHub-adattárban (a címben szerepeljen OCR-), vagy válaszoljon egy meglévő problémára.
Előfeltételek
- Egy Copilot+ PC a Qualcomm, az Intel vagy az AMD kínálatából.
- Az Arm64EC (Emulation Compatible) jelenleg nem támogatott.
- Windows 11 Insider Preview Build 26120.3073 -at (fejlesztői és bétacsatornák) vagy újabb verziót kell telepíteni az eszközre.
Mit tehetek a Windows App SDK-val és az AI-szövegfelismeréssel?
A Windows App SDK új AI-szövegfelismerési funkcióival azonosíthatja és felismeri a képek szövegét. A felismert szöveg szöveghatárait és megbízhatósági pontszámait is lekérheti.
ImageBuffer létrehozása fájlból
Ebben a példában egy LoadImageBufferFromFileAsync
függvényt hívunk meg egy ImageBuffer képfájlból való lekéréséhez.
A LoadImageBufferFromFileAsync függvényben a következő lépéseket hajtjuk végre:
- Hozzon létre egy StorageFile objektumot a megadott fájlelérési útból.
- Nyisson meg egy streamet a StorageFile-on OpenAsynchasználatával.
- Hozzon létre egy BitmapDecoder- a streamhez.
- Hívd meg a GetSoftwareBitmapAsync metódust a bittérkép-dekóderen, hogy egy SoftwareBitmap objektumot szerezz.
- Visszaad egy képpuffert a CreateBufferAttachedToBitmap-ből.
using Microsoft.Windows.Vision;
using Microsoft.Graphics.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);
}
Szöveg felismerése bitképen
Az alábbi példa bemutatja, hogyan ismerhet fel egy szöveget egy SoftwareBitmap objektumban egyetlen sztringértékként:
- Hozzon létre egy TextRecognizer objektumot a
EnsureModelIsReady
függvény hívásán keresztül, amely azt is megerősíti, hogy van egy nyelvi modell a rendszeren. - Az előző kódrészletben kapott bitkép használatával meghívjuk a
RecognizeTextFromSoftwareBitmap
függvényt. - Meghívhatja CreateBufferAttachedToBitmap a képfájlon, hogy lekérjen egy ImageBuffer objektumot.
- Hívja meg a RecognizeTextFromImage-t, hogy lekérje a felismert szöveget a ImageBuffer-ból.
- Hozzon létre egy wstringstream objektumot, és töltse be a felismert szöveggel.
- Adja vissza a sztringet.
Jegyzet
A EnsureModelIsReady
függvénnyel ellenőrizheti a szövegfelismerési modell készültségi állapotát (és szükség esetén telepítheti).
using Microsoft.Windows.Vision;
using Microsoft.Graphics.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();
}
Szóhatárok és megbízhatóság lekérése
Itt bemutatjuk, hogyan jelenítheti meg az egyes szavak Határolókeret egy SoftwareBitmap objektumban színkódolt sokszögek gyűjteményeként egy Grid elemen.
Jegyzet
Ebben a példában feltételezzük, hogy egy TextRecognizer objektumot már létrehoztak és átadták a függvénynek.
using Microsoft.Windows.Vision;
using Microsoft.Graphics.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);
}
}
}
További erőforrások
Fájlok és mappák elérése Windows App SDK-val és WinRT API-kkal