Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Rozpoznawanie tekstu, znane również jako optyczne rozpoznawanie znaków (OCR), jest obsługiwane w systemie Windows AI Foundry za pośrednictwem zestawu interfejsów API opartych na sztucznej inteligencji (AI), które mogą wykrywać i wyodrębniać tekst na obrazach i konwertować go na strumienie znaków czytelnych dla maszyny.
Te interfejsy API mogą identyfikować znaki, wyrazy, linie, wielokątne granice tekstu i zapewniać poziomy ufności dla każdego dopasowania. Są także wyłącznie wspierane przez akcelerację sprzętową w urządzeniach z jednostką przetwarzania neuronowego (NPU), co sprawia, że działają szybciej i dokładniej niż starsze interfejsy API Windows.Media.Ocr.OcrEngine w Windows platform SDK.
Aby uzyskać szczegółowe informacje o interfejsie API, zobacz dokumentacja interfejsu API dla funkcji rozpoznawania tekstu (OCR).
Ważne
Poniżej znajduje się lista funkcji sztucznej inteligencji systemu Windows i wersji zestawu SDK aplikacji systemu Windows, w której są one obecnie obsługiwane.
Wersja 1.8 Eksperymentalna (1.8.0-experimental1) - Wymazywanie Obiektów, Phi Silica, Strojenie LoRA dla Phi Silica, Podsumowanie Rozmowy (Analiza tekstu)
Prywatna wersja zapoznawcza — wyszukiwanie semantyczne
Wersja 1.7.1 (1.7.250401001) — wszystkie inne interfejsy API
Te interfejsy API będą działać tylko na urządzeniach windows Insider Preview (WIP), które otrzymały aktualizację z 7 maja. 28-29 maja zostanie wydana opcjonalna aktualizacja na urządzenia inne niż WIP, a następnie aktualizacja z 10 czerwca. Ta aktualizacja przyniesie z nim modele sztucznej inteligencji wymagane do działania interfejsów API sztucznej inteligencji systemu Windows. Te aktualizacje będą również wymagać, aby każda aplikacja korzystająca z interfejsów API sztucznej inteligencji systemu Windows nie mogła tego zrobić, dopóki aplikacja nie otrzyma tożsamości pakietu w czasie wykonywania.
Co mogę zrobić za pomocą funkcji rozpoznawania tekstu sztucznej inteligencji?
Używanie funkcji rozpoznawania tekstu sztucznej inteligencji do identyfikowania i rozpoznawania tekstu na obrazie. Możesz również uzyskać granice tekstu i poziomy ufności dla rozpoznanego tekstu.
Tworzenie elementu ImageBuffer z pliku
W tym przykładzie WinUI, używamy funkcji LoadImageBufferFromFileAsync
w celu uzyskania ImageBuffer z pliku graficznego.
W funkcji LoadImageBufferFromFileAsync wykonamy następujące kroki:
- Utwórz obiekt StorageFile na podstawie określonej ścieżki pliku.
- Otwórz strumień w pliku StorageFile przy użyciu narzędzia OpenAsync.
- Utwórz BitmapDecoder dla strumienia.
- Wywołaj metodę GetSoftwareBitmapAsync na dekoderze mapy bitowej, aby uzyskać obiekt SoftwareBitmap .
- Zwraca bufor obrazu z elementu CreateBufferAttachedToBitmap.
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()};
}
Rozpoznawanie tekstu na obrazie mapy bitowej
W poniższym przykładzie pokazano, jak rozpoznać jakiś tekst w obiekcie SoftwareBitmap jako pojedynczą wartość ciągu:
- Utwórz obiekt TextRecognizer za pomocą wywołania
EnsureModelIsReady
funkcji, co potwierdza również obecność modelu językowego w systemie. - Używając mapy bitowej uzyskanej w poprzednim fragmencie kodu, wywołujemy funkcję
RecognizeTextFromSoftwareBitmap
. - Wywołaj metodę CreateBufferAttachedToBitmap w pliku obrazu, aby uzyskać obiekt ImageBuffer .
- Wywołaj metodę RecognizeTextFromImage , aby uzyskać rozpoznany tekst z elementu ImageBuffer.
- Utwórz obiekt wstringstream i załaduj go rozpoznanym tekstem.
- Zwróć ciąg.
Notatka
Funkcja EnsureModelIsReady
służy do sprawdzania stanu gotowości modelu rozpoznawania tekstu (i zainstalowania go w razie potrzeby).
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();
}
Uzyskaj granice wyrazów i pewność
W tym miejscu pokazano, jak wizualizować BoundingBox każdego wyrazu w obiekcie SoftwareBitmap jako kolekcję wielokątów kodowanych kolorami w elemencie Grid.
Notatka
W tym przykładzie przyjęto założenie, że obiekt TextRecognizer został już utworzony i przekazany do funkcji.
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);
}
}
}
Odpowiedzialne używanie sztucznej inteligencji
Użyliśmy kombinacji poniższych kroków, aby upewnić się, że te interfejsy API obrazowania są wiarygodne, bezpieczne i tworzone odpowiedzialnie. Zalecamy zapoznanie się z najlepszymi rozwiązaniami opisanymi w temacie Odpowiedzialne tworzenie sztucznej inteligencji w systemie Windows podczas implementowania funkcji sztucznej inteligencji w aplikacji.