一、概述
微软的Win10/11已经原生支持OCR识别,Windows 11 允许用户通过预装的 Power Automate 应用创建自动化,其中包含OCR识别功能。
如果装了vs,会安装windows kits,需要用到。类似下面的文件夹就是头文件的目录。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0
文件夹下面会有
看一个老外说“ucrt”文件夹包含新的通用 CRT 头文件。 “winrt”文件夹包含 WinRT 头文件。 最后,“shared”和“um”文件夹包含您认为的传统 Windows SDK 头文件,但是没有说cppwinrt是什么用处。
暂时不管,我们这里用的winrt。
二、引入头文件
Windows.Globalization.h,我们用到语言相关内容。
windows.media.ocr.h,就是ocr了
windows.graphics.imaging.h,是用来创建图像,传递给ocr。
winrt/Windows.Storage.h / winrt/Windows.Storage.Streams.h,用来从本地读取图片。
winrt/Windows.Foundation.Collections.h,顾名思义就是集合相关。
#define _SILENCE_CLANG_COROUTINE_MESSAGE
#include "winrt/Windows.Globalization.h"
#include "winrt/windows.media.ocr.h"
#include "winrt/windows.graphics.imaging.h"
#include "winrt/Windows.Storage.h"
#include "winrt/Windows.Storage.Streams.h"
#include "winrt/Windows.Foundation.Collections.h"
三、进行测试
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Storage;
using namespace winrt::Windows::Storage::Streams;
using namespace winrt::Windows::Globalization;
using namespace winrt::Windows::Media::Ocr;
using namespace winrt::Windows::Graphics::Imaging;
1、获取本地图片路径
这个ConvertUtf8ToWide方法是用来把std::string转为std::wstring。
//获取图片路径,这个ConvertUtf8ToWide方法是用来吧std::string
std::wstring uriImage = MyTools::ConvertUtf8ToWide(_newFilepath);
2、读取图片得到SoftwareBitmap
//获取SoftwareBitmap
RandomAccessStreamReference streamRef = RandomAccessStreamReference::CreateFromFile(StorageFile::GetFileFromPathAsync(uriImage).get());
IAsyncOperation<IRandomAccessStreamWithContentType> stream = streamRef.OpenReadAsync();
Buffer buffer = Buffer((uint)stream.get().Size());
auto decoder = BitmapDecoder::CreateAsync(stream.get().CloneStream());
IAsyncOperation<SoftwareBitmap> softwareBitmap = decoder.get().GetSoftwareBitmapAsync();
3、声明要识别的语言类型
比如中文是zh-CN、英文是en-US,其它是啥语言得查,不过这个语言需要系统本身支持。也就是说,见下图,需要安装对应语言包,才能使用。
这里需要hstring,因为不是直接声明,所以需要从std::string转换一下。
Language language(winrt::to_hstring(MyTools::get_Choise_Language(_language_index, _ocrengine)));
win11系统的语言和区域界面
4、检测是否支持对应语言
如果没有安装语言包或者输入错误得就会返回false;
OcrEngine::IsLanguageSupported(language);
5、创建ocr识别引擎
OcrEngine engine = OcrEngine::TryCreateFromLanguage(language);
6、进行识别
这里softwareBitmap.get()就是我们的图片。
engine.RecognizeAsync方法就是对图片进行识别。
得到得lines就是按行识别的结果,目前好像只能这样使用,如果没识别出来,就lines的size就是0。
Collections::IVectorView<OcrLine> lines = engine.RecognizeAsync(softwareBitmap.get()).get().Lines();
7、打印识别结果
if(lines.Size()>0)
{
for (auto p : lines)
{
std::string text = "";
for (OcrWord word : p.Words()) {
text += to_string(word.Text()) + ((_language_index>0)?" ":"");
}
qDebug() << "识别结果:" << text.c_str();
}
}
四、下一篇
还没写