QT案例实战1 - 从零开始编写一个OCR工具软件 (5)引入微软OCR

一、概述

        微软的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();
    }
}

四、下一篇

        还没写

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/127121788