Windows Uygulama SDK'sında Yapay Zeka Metin Tanıma (OCR) kullanmaya başlama
Önemli
Windows Uygulama SDK'sının en son deneysel kanal sürümünde kullanılabilir.
Windows Uygulama SDK'sı deneysel kanalı, geliştirmenin erken aşamalarında API'leri ve özellikleri içerir. Deneysel kanaldaki tüm API'ler kapsamlı düzeltmelere ve hataya neden olan değişikliklere tabidir ve herhangi bir zamanda sonraki sürümlerden kaldırılabilir. Deneysel özellikler üretim ortamlarında kullanılmak üzere desteklenmez ve bunları kullanan uygulamalar Microsoft Store'da yayımlanamaz.
- Bağımsız uygulamalar desteklenmez.
Optik karakter tanıma (OCR) olarak da bilinen metin tanıma, görüntülerdeki metinleri algılayıp ayıklayıp makine tarafından okunabilir karakter akışlarına dönüştürebilen yapay zeka (AI) destekli bir dizi API aracılığıyla Windows Uygulama SDK'sı tarafından desteklenir.
Bu API'ler karakterleri, sözcükleri, satırları, çokgen metin sınırlarını tanımlayabilir ve her eşleşme için güvenilirlik düzeyleri sağlayabilir. Ayrıca, nöral işlem birimine (NPU) sahip cihazlarda donanım hızlandırma ile özel olarak desteklenir ve bu da onları Windows platformu SDK'sıeski Windows.Media.Ocr.OcrEngine API'lerinden daha hızlı ve daha doğru hale getirir.
API ayrıntıları için bkz. Windows Uygulama SDK'sında Metin Tanıma (OCR) içinAPI başvurusu.
Bahşiş
Windows Uygulama SDK'sı GitHub deposunda (başlıkta OCR dahil) yeni bir sorun oluşturarak veya mevcut bir soruna yanıt vererek bu API'ler ve işlevleri hakkında geri bildirim sağlayın.
Önkoşullar
- Qualcomm, Intel veya AMD'den Copilot+ bilgisayar.
- Arm64EC (Öykünme Uyumlu) şu anda desteklenmiyor.
- Windows 11 Insider Preview Sürümü 26120.3073 (Geliştirme ve Beta Kanalları) veya daha yeni bir sürüm cihazınıza yüklenmelidir.
Windows Uygulama SDK'sı ve Yapay Zeka Metin Tanıma ile ne yapabilirim?
Bir görüntüdeki metni tanımlamak ve tanımak için Windows Uygulama SDK'sında yeni Yapay Zeka Metin Tanıma özelliklerini kullanın. Tanınan metin için metin sınırlarını ve güvenilirlik puanlarını da alabilirsiniz.
Dosyadan ImageBuffer oluşturma
Bu örnekte, bir görüntü dosyasından LoadImageBufferFromFileAsync
almak için bir işlevi çağırıyoruz.
LoadImageBufferFromFileAsync işlevinde aşağıdaki adımları tamamlarız:
- Belirtilen dosya yolundan bir StorageFile nesnesi oluşturun.
- OpenAsynckullanarak StorageFile üzerinde bir akış açın.
- Akış için bir BitmapDecoder oluşturun.
- Bitmap kod çözücüde GetSoftwareBitmapAsync çağrısı yaparak bir SoftwareBitmap nesnesi alın.
- CreateBufferAttachedToBitmapile bir görüntü arabelleği döndürün.
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);
}
Bit eşlem görüntüsündeki metni tanıma
Aşağıdaki örnekte, SoftwareBitmap nesnesindeki bazı metinlerin tek bir dize değeri olarak nasıl tanınacakları gösterilmektedir:
-
işlevine yapılan bir çağrı aracılığıyla bir
EnsureModelIsReady
nesnesi oluşturun ve bu da sistemde bir dil modeli olduğunu onaylar. - Önceki kod parçacığında elde edilen bit eşlemi kullanarak
RecognizeTextFromSoftwareBitmap
işlevini çağırırız. - Görüntü dosyasında CreateBufferAttachedToBitmap çağırarak bir ImageBuffer nesnesi alın.
- RecognizeTextFromImage
'i çağırarak, ImageBuffer 'ten tanınan metni elde edin. - Bir wstringstream nesnesi oluşturun ve tanınan metinle yükleyin.
- Dizeyi döndür.
Not: (Bilgilendirme)
EnsureModelIsReady
işlevi, metin tanıma modelinin hazır olma durumunu denetlemek (ve gerekirse yüklemek) için kullanılır.
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();
}
Sözcük sınırlarını ve güveni alma
Burada, bir
Not: (Bilgilendirme)
Bu örnekte textrecognizer nesnesinin önceden oluşturulduğunu ve işleve geçirildiğini varsayarız.
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);
}
}
}
Ek kaynaklar
Windows Uygulama SDK'sı ve WinRT API'leri ile dosya ve klasörlere erişme
İlgili içerik
- Windows'da Sorumlu Üretken Yapay Zeka Uygulamaları ve Özellikleri Geliştirme
- Windows Uygulama SDK'sı Metin Tanıma API'leri için
API başvurusu - Windows Uygulama SDK'sı
- Windows Uygulama SDK'nin en son sürüm notları