İngilizce dilinde oku

Aracılığıyla paylaş


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.

İpucu

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

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:

  1. Belirtilen dosya yolundan bir StorageFile nesnesi oluşturun.
  2. OpenAsynckullanarak StorageFile üzerinde bir akış açın.
  3. Akış için bir BitmapDecoder oluşturun.
  4. Bitmap kod çözücüde GetSoftwareBitmapAsync çağrısı yaparak bir SoftwareBitmap nesnesi alın.
  5. CreateBufferAttachedToBitmapile bir görüntü arabelleği döndürün.
C#
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);
}

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:

  1. 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.
  2. Önceki kod parçacığında elde edilen bit eşlemi kullanarak RecognizeTextFromSoftwareBitmap işlevini çağırırız.
  3. Görüntü dosyasında CreateBufferAttachedToBitmap çağırarak bir ImageBuffer nesnesi alın.
  4. RecognizeTextFromImage 'i çağırarak, ImageBuffer'ten tanınan metni elde edin.
  5. Bir wstringstream nesnesi oluşturun ve tanınan metinle yükleyin.
  6. Dizeyi döndür.

Not

EnsureModelIsReady işlevi, metin tanıma modelinin hazır olma durumunu denetlemek (ve gerekirse yüklemek) için kullanılır.

C#
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();
}

Sözcük sınırlarını ve güveni alma

Burada, bir SoftwareBitmap nesnesindeki her sözcüğün Sınırlayıcı Kutusu'nun, Kılavuz öğesi üzerinde renk kodlu çokgenlerden oluşan bir koleksiyon şeklinde nasıl görselleştirileceğini göstereceğiz.

Not

Bu örnekte textrecognizer nesnesinin önceden oluşturulduğunu ve işleve geçirildiğini varsayarız.

C#
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);
        }
    }
}

Ek kaynaklar

Windows Uygulama SDK'sı ve WinRT API'leri ile dosya ve klasörlere erişme