用C++调用Windows.Media.Ocr接口实现图片的OCR识别
这个接口最开始是给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;
}
浙公网安备 33010602011771号