Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Optik karakter tanıma (OCR) olarak da bilinen metin tanıma, görüntüler içindeki metinleri algılayıp ayıklayıp makine tarafından okunabilir karakter akışlarına dönüştürebilen bir windows AI API'leri kümesi 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, sinir işlem birimi (NPU) olan cihazlarda donanım hızlandırma ile de desteklenir ve bu da onları Windows platformu SDK'sı içindeki eski Windows.Media.Ocr.OcrEngine API'lerinden daha hızlı ve daha doğru hale getirir.
API ayrıntıları için bkz. Metin Tanıma (OCR) için API başvurusu.
Yapay Zeka Metin Tanıma ile ne yapabilirim?
Bir görüntüdeki metni tanımlamak ve tanımak için AI Metin Tanıma özelliklerini kullanın. Tanınan metin için metin sınırlarını ve güvenilirlik puanlarını da alabilirsiniz.
Not: (Bilgilendirme)
Okunaksız veya küçük boyutlu karakterler yanlış sonuçlar oluşturabilir.
Dosyadan ImageBuffer oluşturma
Bu WinUI örneğinde, bir LoadImageBufferFromFileAsync görüntü dosyasından ImageBuffer almak için bir işlev çağırırız.
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.AI.Imaging;
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()};
}
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
EnsureModelIsReadynesnesi oluşturun ve bu da sistemde bir dil modeli olduğunu onaylar. - Önceki kod parçacığında elde edilen bit eşlemi kullanarak
RecognizeTextFromSoftwareBitmapiş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 geri döndür.
Not: (Bilgilendirme)
İşlev, EnsureModelIsReady metin tanıma modelinin hazır olma durumunu denetler (ve gerekirse yükler).
using Microsoft.Windows.AI.Imaging;
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.NotReady)
{
var loadResult = await TextRecognizer.EnsureReadyAsync();
if (loadResult.Status != AIFeatureReadyResultState.Success)
{
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();
}
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.AI.Imaging;
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);
}
}
}
Sorumluluk sahibi yapay zeka
Bu API'lerin güvenilir, güvenli ve sorumlu bir şekilde oluşturulduğundan emin olmak için Microsoft Sorumlu Yapay Zeka Standartları'nda açıklanan temel ilkeleri ve uygulamaları izledik. Uygulamanızda yapay zeka özelliklerini uygulama hakkında daha fazla ayrıntı için bkz. Windows'ta Sorumlu Üretken Yapay Zeka Geliştirme.