用C++调用Windows.Media.Ocr接口实现图片的OCR识别

发布时间 2023-12-15 11:36:41作者: [Blowfish]

这个接口最开始是给UWP程序用的。C++里需要用C++/WinRT方式调用。默认参数的识别率也不是很高的样子。只支持Win10+。

#include <winrt/Windows.Storage.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Media.Ocr.h>
#include <winrt/Windows.Globalization.h>
#include <winrt/Windows.Foundation.h>
#include <iostream>
#include <locale.h>

using namespace winrt;
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
using namespace Windows::Graphics::Imaging;
using namespace Windows::Media::Ocr;
using namespace Windows::Globalization;
using namespace winrt::Windows::Foundation;

void InitializeWinRT()
{
    init_apartment();
}

SoftwareBitmap LoadImage(const winrt::hstring& imagePath)
{
    StorageFile imageFile = StorageFile::GetFileFromPathAsync(imagePath).get();
    IRandomAccessStream fileStream = imageFile.OpenAsync(FileAccessMode::Read).get();
    BitmapDecoder decoder = BitmapDecoder::CreateAsync(fileStream).get();
    SoftwareBitmap softwareBitmap = decoder.GetSoftwareBitmapAsync().get();

    return softwareBitmap;
}

winrt::hstring PerformOcr(const SoftwareBitmap& softwareBitmap)
{
    winrt::hstring languageTag = L"zh-CN";
    Windows::Globalization::Language lang(languageTag);
    OcrEngine ocrEngine = OcrEngine::TryCreateFromLanguage(lang);
    OcrResult ocrResult = ocrEngine.RecognizeAsync(softwareBitmap).get();

    return ocrResult.Text();
}

int main()
{
    _wsetlocale(LC_ALL, L"zh-CN");

    InitializeWinRT();

    winrt::hstring imagePath = L"c:\\test.jpg";

    SoftwareBitmap softwareBitmap = LoadImage(imagePath);
    winrt::hstring resultText = PerformOcr(softwareBitmap);

    std::wcout << L"识别结果:" << resultText.c_str() << std::endl;

    return 0;
}