Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pengenalan teks, juga dikenal sebagai pengenalan karakter optik (OCR), didukung oleh sekumpulan API AI Windows yang dapat mendeteksi dan mengekstrak teks dalam gambar dan mengonversinya menjadi aliran karakter yang dapat dibaca mesin.
API ini dapat mengidentifikasi karakter, kata, baris, batas teks poligonal, dan memberikan tingkat keyakinan untuk setiap kecocokan. Mereka juga didukung secara eksklusif oleh pemercepatan perangkat keras pada perangkat yang hanya memiliki unit pemrosesan neural (NPU), membuatnya lebih cepat dan lebih akurat daripada API lama Windows.Media.Ocr.OcrEngine di SDK platform Windows.
Untuk detail API, lihat API ref untuk Pengenalan Teks (OCR).
Apa yang bisa saya lakukan dengan Pengenalan Teks AI?
Gunakan fitur Pengenalan Teks AI untuk mengidentifikasi dan mengenali teks dalam gambar. Anda juga bisa mendapatkan batas teks dan skor keyakinan untuk teks yang dikenali.
Catatan
Karakter yang tidak dapat dibaca atau berukuran kecil dapat memberikan hasil yang tidak akurat.
Membuat ImageBuffer dari file
Dalam contoh WinUI ini kita memanggil LoadImageBufferFromFileAsync fungsi untuk mendapatkan ImageBuffer dari file gambar.
Dalam fungsi LoadImageBufferFromFileAsync, kami menyelesaikan langkah-langkah berikut:
- Buat objek StorageFile dari jalur file yang ditentukan.
- Buka aliran di StorageFile menggunakan OpenAsync.
- Buat BitmapDecoder untuk aliran.
- Panggil GetSoftwareBitmapAsync pada dekoder bitmap untuk mendapatkan objek SoftwareBitmap .
- Mengembalikan buffer gambar dari CreateBufferAttachedToBitmap.
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()};
}
Mengenali teks dalam gambar bitmap
Contoh berikut menunjukkan cara mengenali beberapa teks dalam objek SoftwareBitmap sebagai nilai string tunggal:
- Buat objek TextRecognizer melalui panggilan ke
EnsureModelIsReadyfungsi, yang juga mengonfirmasi adanya model bahasa pada sistem. - Menggunakan bitmap yang diperoleh di cuplikan sebelumnya, kami memanggil
RecognizeTextFromSoftwareBitmapfungsi . - Panggil CreateBufferAttachedToBitmap pada file gambar untuk mendapatkan objek ImageBuffer .
- Panggil RecognizeTextFromImage untuk mendapatkan teks yang dikenali dari ImageBuffer.
- Buat objek wstringstream dan muat dengan teks yang dikenali.
- Kembalikan string.
Catatan
Fungsi ini EnsureModelIsReady memeriksa status kesiapan model pengenalan teks (dan menginstalnya jika perlu).
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();
}
Mendapatkan batas kata dan tingkat kepastian
Di sini kami menunjukkan cara memvisualisasikan BoundingBox dari setiap kata dalam objek SoftwareBitmap sebagai kumpulan poligon berkode warna pada elemen Grid.
Catatan
Untuk contoh ini, kami mengasumsikan objek TextRecognizer telah dibuat dan diteruskan ke fungsi .
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);
}
}
}
AI yang Bertanggung Jawab
Kami telah mengikuti prinsip dan praktik inti yang dijelaskan dalam Standar AI Penanggung Jawab Microsoft untuk memastikan API ini dapat dipercaya, aman, dan dibangun secara bertanggung jawab. Untuk detail selengkapnya tentang menerapkan fitur AI di aplikasi Anda, lihat Pengembangan AI Generatif yang Bertanggung Jawab di Windows.