Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A szövegfelismerést, más néven optikai karakterfelismerést (OCR) a Windows AI Foundry egy mesterséges intelligenciával (AI) támogatott API-kkal 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-ban.
Az API részleteiért lásd: API ref for Text Recognition (OCR).
Fontos
Az alábbiakban felsoroljuk a Windows AI-funkciókat és a Windows App SDK kiadást, amelyekben jelenleg támogatottak.
1.8-os kísérleti verzió (1.8.0-experimental1) - Object Erase, Phi Silica, LoRA finomhangolás a Phi Silica, Beszélgetés összegzése (Szövegintelligencia)
Privát előzetes verzió – Szemantikai keresés
1.7.1-es verzió (1.7.250401001) – Minden más API
Ezek az API-k csak a május 7-i frissítést kapott Windows Insider Preview (WIP) eszközökön lesznek működőképesek. Május 28-29-én egy opcionális frissítés jelenik meg a nem WIP-eszközökre, majd a jún. 10-i frissítés. Ez a frissítés magával hozza a Windows AI API-k működéséhez szükséges AI-modelleket. Ezek a frissítések azt is megkövetelik, hogy a Windows AI API-kat használó alkalmazások ezt mindaddig nem tudják megtenni, amíg az alkalmazás futásidőben nem kap csomagidentitást.
Mi a teendő az AI-szövegfelismeréssel?
Használja az AI szövegfelismerési funkcióit a képen lévő szöveg azonosítására és felismerésére. 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 WinUI-példában egy függvényt hívunk meg egy LoadImageBufferFromFileAsync
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ájl elérési útjából.
- Nyisson meg egy streamet a StorageFile-on az OpenAsync használatával.
- Hozzon létre egy BitmapDecodert a streamhez.
- Hívja meg a GetSoftwareBitmapAsync parancsot a bitkép-dekóderen egy SoftwareBitmap-objektum lekéréséhez.
- A CreateBufferAttachedToBitmap rendszerképpuffert ad vissza.
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);
}
#include <iostream>
#include <sstream>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.UI.Xaml.Controls.h>
#include<winrt/Microsoft.UI.Xaml.Media.h>
#include<winrt/Microsoft.UI.Xaml.Shapes.h>
using namespace winrt;
using namespace Microsoft::UI::Xaml;
using namespace Microsoft::Windows::AI;
using namespace Microsoft::Windows::AI::Imaging;
using namespace winrt::Microsoft::UI::Xaml::Controls;
using namespace winrt::Microsoft::UI::Xaml::Media;
winrt::Windows::Foundation::IAsyncOperation<winrt::hstring>
MainWindow::RecognizeTextFromSoftwareBitmap(
Windows::Graphics::Imaging::SoftwareBitmap const& bitmap)
{
winrt::Microsoft::Windows::AI::Imaging::TextRecognizer textRecognizer =
EnsureModelIsReady().get();
Microsoft::Graphics::Imaging::ImageBuffer imageBuffer =
Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(bitmap);
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.str()};
}
Szöveg felismerése bitképen
Az alábbi példa bemutatja, hogyan ismerhet fel bizonyos 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 nyelvi modell a rendszeren. - Az előző kódrészletben kapott bitkép használatával meghívjuk a
RecognizeTextFromSoftwareBitmap
függvényt. - Hívja meg a CreateBufferAttachedToBitmap parancsot a képfájlban egy ImageBuffer-objektum lekéréséhez.
- Hívja meg a RecognizeTextFromImage parancsot , hogy lekérje a felismert szöveget az ImageBufferbő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.Windows.AI;
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.GetReadyState() == AIFeatureReadyState.EnsureNeeded)
{
var loadResult = await TextRecognizer.EnsureReadyAsync();
if (loadResult.Status != PackageDeploymentStatus.CompletedSuccess)
{
throw new Exception(loadResult.ExtendedError().Message);
}
}
return await TextRecognizer.CreateAsync();
}
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::AI::Imaging::TextRecognizer> MainWindow::EnsureModelIsReady()
{
if (winrt::Microsoft::Windows::AI::Imaging::TextRecognizer::GetReadyState() == AIFeatureReadyState::NotReady)
{
auto loadResult = TextRecognizer::EnsureReadyAsync().get();
if (loadResult.Status() != AIFeatureReadyResultState::Success)
{
throw winrt::hresult_error(loadResult.ExtendedError());
}
}
return winrt::Microsoft::Windows::AI::Imaging::TextRecognizer::CreateAsync();
}
Szóhatárok és megbízhatóság lekérése
Itt bemutatjuk, hogyan lehet az egyes szavak határolókeretét megjeleníteni a SoftwareBitmap-objektumban úgy, hogy azok egy rácselem színkódolt sokszögeinek gyűjteményeként jelenjenek meg.
Jegyzet
Ebben a példában feltételezzük, hogy egy TextRecognizer-objektum már létrejött, és átadta 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);
}
}
}
void MainWindow::VisualizeWordBoundariesOnGrid(
Windows::Graphics::Imaging::SoftwareBitmap const& bitmap,
Grid const& grid,
TextRecognizer const& textRecognizer)
{
Microsoft::Graphics::Imaging::ImageBuffer imageBuffer =
Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(bitmap);
RecognizedText result = textRecognizer.RecognizeTextFromImage(imageBuffer);
auto greenBrush = SolidColorBrush(winrt::Microsoft::UI::Colors::Green());
auto yellowBrush = SolidColorBrush(winrt::Microsoft::UI::Colors::Yellow());
auto redBrush = SolidColorBrush(winrt::Microsoft::UI::Colors::Red());
for (const auto& line : result.Lines())
{
for (const auto& word : line.Words())
{
PointCollection points;
const auto& bounds = word.BoundingBox();
points.Append(bounds.TopLeft);
points.Append(bounds.TopRight);
points.Append(bounds.BottomRight);
points.Append(bounds.BottomLeft);
winrt::Microsoft::UI::Xaml::Shapes::Polygon polygon{};
polygon.Points(points);
polygon.StrokeThickness(2);
if (word.MatchConfidence() < 0.33)
{
polygon.Stroke(redBrush);
}
else if (word.MatchConfidence() < 0.67)
{
polygon.Stroke(yellowBrush);
}
else
{
polygon.Stroke(greenBrush);
}
grid.Children().Append(polygon);
}
}
}
Felelős mesterséges intelligencia
Az alábbi lépések kombinációjával biztosítjuk, hogy ezek a képalkotó API-k megbízhatóak, biztonságosak és felelősségteljesen legyenek felépítve. Javasoljuk, hogy tekintse át a Felelős Generatív AI-fejlesztés windowsos fejlesztésével kapcsolatos ajánlott eljárásokat az alkalmazás AI-funkcióinak megvalósításakor.