Добавьте действие распознавания текста OCR

prostors

Client
Регистрация
16.12.2020
Сообщения
1 504
Реакции
93
Баллы
48
Добавьте действие распознавания текста OCR

копия из gemini по запросу "родной встроенный движок OCR от Windows 10/11. подробнее пожалуйста"

Встроенный в Windows движок распознавания текста называются Windows Media OCR API (он находится в пространстве имён <span>Windows.Media.Ocr</span>).

Microsoft добавила его начиная с Windows 10 для системы Universal Windows Platform (UWP). Главная фишка в том, что движок уже встроен в операционную систему, работает полностью офлайн и использует оптимизированные C++ алгоритмы библиотеки Windows.

Key Features и Преимущества​

  1. Не нужно ничего скачивать:

    В отличие от сторонних библиотек вроде Tesseract (который весит сотни мегабайт и требует скачивания моделей), Windows.Media.Ocr поставляется вместе с Windows.
  2. Точные координаты каждого слова:

    Движок возвращает не просто полотно текста, а иерархическую структуру: <span>Строки</span> → <span>Слова</span>. Для каждого отдельного слова вы получаете его рамку — BoundingRect (координаты X, Y, ширину и высоту). Это как раз то, благодаря чему мы смогли вычислить центр текста и кликнуть по нему!
  3. Поддержка языков (Language Packs):

    Он использует языковые пакеты, установленные у вас в Windows. Если в системе включён русский или английский язык ввода, соответствующие языковые OCR-модели загружаются автоматически.
  4. Высокая скорость:

    Так как это нативный компонент ОС (WinRT/C++), скриншот FullHD распознаётся буквально за 100–300 миллисекунд.

Как это устроено "под капотом"?​

Процесс распознавания в коде состоит из 4 базовых шагов:

[ Изображение ] ➔ [ SoftwareBitmap ] ➔ [ OcrEngine.RecognizeAsync ] ➔ [ OcrResult ]<br>
  1. Загрузка в формат SoftwareBitmap: Картинка (или скриншот экрана) конвертируется в специальные пиксельные данные, понятные для Windows Runtime APIs.
  2. Инициализация OcrEngine: Движок создается под нужный язык ([Windows.Media.Ocr.OcrEngine]::TryCreateFromLanguage($lang)).
  3. Запуск распознавания: Метод RecognizeAsync() анализирует изображение.
  4. Разбор OcrResult: На выходе получается объект, содержащий collection строк (Lines) и слов (Words).

Где еще этот движок используется?​

Вы наверняка пересекались с ним в повсеместной работе Windows, даже не подозревая об этом:

  • "Ножницы" (Snipping Tool) в Windows 11 — функция Text Actions (копирование текста со скриншота) работает именно на базе этого API.
  • Поиск в Windows: Индексация текста внутри картинках и PDF-файлах.
  • Приложение "Связь с телефоном" (Phone Link) — выбор и копирование текста из фото на телефоне.

вопросы:
будет ли он распознавать язык текста?
будет ли он распознавать язык текста написанный в транслитом? дважды или трижды?
 
давайте сразу добавим определение бренда - торговых знаков в тексте, чтобы избежать проблем law и сразу получить дополнительную инфо о тексте
 
Здравствуйте,

Передам ваше предложение команде, но пока внедрение OCR не планировали.
 
Добавьте действие распознавания текста OCR
Вы может быть пробовали как-то самостоятельно заиспользовать это на C#?
Может есть примеры кода, подключения к Зенно?

Штука интересная...
Пока разработчики будут думать нужно ли это - хотелось бы запустить что-то готовое, посмотреть как работает.
 
Вы может быть пробовали как-то самостоятельно заиспользовать это на C#?
нет, https://ocr.space/ocrapi нормально работает
Может есть примеры кода, подключения к Зенно?
нету. поэтому и пишу тут, чтобы официальная версия была
 
  • Оценить
Реакции: BAZAg
Windows Media OCR API с кирилицей и смешанного тонтекста Увы не справляется
 
Tesseract OCR норм если текст на одном языке
 
нету. поэтому и пишу тут, чтобы официальная версия была
Думаю если были бы примеры кода, как это работает, то возможно появились бы люди, которые его бы использовали.
И когда много людей использует какой-то функционал - то может быть разработчики обратили бы внимание и добавили бы решение с коробки.
Это так, когда-то просили добавить работу с базой данных - и тогда этот функционал был добавлен.
Или когда просили добавить PUT, DELETE и другие запросы - и такой функционал также появился через какое-то время.

Tesseract OCR норм если текст на одном языке
Он вроде какие-то ограничения имеет или нет по длине ответа?
 
Думаю если были бы примеры кода, как это работает, то возможно появились бы люди, которые его бы использовали.
И когда много людей использует какой-то функционал - то может быть разработчики обратили бы внимание и добавили бы решение с коробки.
Это так, когда-то просили добавить работу с базой данных - и тогда этот функционал был добавлен.
Или когда просили добавить PUT, DELETE и другие запросы - и такой функционал также появился через какое-то время.


Он вроде какие-то ограничения имеет или нет по длине ответа?
Tesseract OCR хорош только в идеальных условиях и имеет лучшую производительность из тех что я тестил и использовал, белый фон+ стандартный шрифт + один конкретный язык , как только это смещается то начинается всякая билиберда.
Сейчас использую навайпкоденную свою сборку (гибрид ocr движка и opencv) со своим api и она работает на основе Кудо ядер, на выходе распознавание не только текста, но и некоторых нужных мне иконок, производительность 6-8 параллельных документов за секунду и все это вывозит 3080ti на 12гб и 2 xeon 2666 в очень разных контекстах документов.
В общем целом на такую реализацию и тесты потрачено не менее 2 месяцев и выкладывать это в открытый доступ нецелесообразно как минимум.......
 
  • Оценить
Реакции: Dmitriy_Zenno и BAZAg
а со стороны ZDE и ZD работает всего 2 вида C# кубиков
 
Сейчас использую навайпкоденную свою сборку (гибрид ocr движка и opencv) со своим api и она работает на основе Кудо ядер, на выходе распознавание не только текста, но и некоторых нужных мне иконок, производительность 6-8 параллельных документов за секунду и все это вывозит 3080ti на 12гб и 2 xeon 2666 в очень разных контекстах документов.
В общем целом на такую реализацию и тесты потрачено не менее 2 месяцев и выкладывать это в открытый доступ нецелесообразно как минимум.......
Все это интересно как отдельный продукт/служба.
Куда просто отправляешь запрос, получаешь ответ или что-то в этом духе.
Возможно даже с какой-то оплатой за каждое распознавание.

А сама тема здесь о том, чтобы иметь какой-то штатный распознаватель, хоть какой-нибудь, хоть корявый, но чтобы был.
Этот распознаватель найдет свою аудиторию тех людей, для которых он подходит и написан майкрософтом.
 
  • Оценить
Реакции: BAZAg
ну его можно своими верификациями обложить и обновлениями
Да, я примерно также подумал, что если бы уже какой-то скелет был, то его потом при желании можно как-то облагораживать.
 
то что мне сказал gemini при попытке воспользоваться:

Особенности и требования​

  • Языковые пакеты Windows: Для распознавания русского или английского языка в Windows 10/11 должен быть установлен соответствующий языковой пакет OCR (Параметры -> Время и язык -> Язык -> Установленные языковые пакеты / Распознавание речи и текста).
  • Скорость: Windows Media OCR работает полностью офлайн, локально на GPU/CPU и отрабатывает быстрее большинства внешних библиотек.

Подключение WinRT API (Windows Media OCR) в ZennoPoster на базе .NET Framework 4.8 имеет свои особенности: ZennoPoster напрямую не всегда дает добавить файл .winmd через стандартный обзор.

Ниже подробное пошаговое руководство, как правильно подключить зависимости в ProjectMaker (редакторе шаблонов ZennoPoster).

Шаг 1. Поиск необходимых файлов на компьютере​

Вам понадобятся три файла. Найдите их через Проводник Windows и скопируйте в одну удобную папку (например, C:\OCR_DLL\) — это предотвратит проблемы с правами доступа.

  1. System.Runtime.WindowsRuntime.dll
    • Где лежит:

      C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\

      (Или в папке C:\Windows\Microsoft.NET\Framework64\v4.0.30319\)
  2. Windows.Foundation.UniversalApiContract.winmd (содержит классы OcrEngine, StorageFile)
    • Где лежит:

      C:\Program Files (x86)\Windows Kits\10\References\&lt;номер_версии&gt;\Windows.Foundation.UniversalApiContract\&lt;номер_версии&gt;\

      (Например: 10.0.19041.0)
  3. Windows.Foundation.FoundationContract.winmd (содержит асинхронные интерфейсы IAsyncOperation)
    • Где лежит:

      C:\Program Files (x86)\Windows Kits\10\References\&lt;номер_версии&gt;\Windows.Foundation.FoundationContract\&lt;номер_версии&gt;\
Примечание: Если у вас не установлена папка Windows Kits, установите Windows 10/11 SDK через Visual Studio Installer или скачайте официальный SDK с сайта Microsoft.

Шаг 2. Добавление ссылок на Assemblies в ZennoPoster​

  1. Откройте ваш проект в ProjectMaker.
  2. В верхнем меню нажмите кнопку «Настройки проекта» (или нажмите Ctrl + Shift + G).
  3. В выпадающем списке слева выберите раздел «Свои C# директивы».
  4. Перейдите во вкладку «Ссылки на Assemblies».
  5. Нажмите кнопку «Добавить» (или зеленый плюс):
    • В появившемся окне обзора файлов укажите тип файлов «Все файлы (., иначе файлы .winmd не отобразятся.
    • По очереди добавьте все три файла: System.Runtime.WindowsRuntime.dll, Windows.Foundation.UniversalApiContract.winmd и Windows.Foundation.FoundationContract.winmd.

Шаг 3. Добавление пространств имен (Using directives)​

  1. В том же окне «Свои C# директивы» перейдите на соседнюю вкладку «Директивы using».
  2. В текстовое поле вставьте следующие строки (каждую с новой строки):
C#

<span>using</span> System;<br><span>using</span> System.IO;<br><span>using</span> System.Threading.Tasks;<br><span>using</span> Windows.Graphics.Imaging;<br><span>using</span> Windows.Media.Ocr;<br><span>using</span> Windows.Storage;<br><span>using</span> Windows.Storage.Streams;<br><span>using</span> Windows.Globalization;<br>
  1. Нажмите кнопку «ОК» внизу окна, чтобы сохранить настройки.

Шаг 4. Решение возможной проблемы «Assembly Not Found» в ZennoPoster​

Иногда ZennoPoster при запуске кубика C# не может автоматически резолвить WinRT-метаданные .winmd. Если при запуске кода возникает ошибка TypeLoadException или FileNotFoundException, добавьте в самый первый C# кубик вашего проекта инициализатор сборки:

C#

<span>// Принудительная загрузка сборок WinRT в домен приложений ZennoPoster</span><br>AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =&gt;<br>{<br> <span>if</span> (args.Name.StartsWith(<span>"Windows.Foundation"</span>) || args.Name.StartsWith(<span>"Windows.Media"</span>))<br> {<br> <span>string</span> path = <span>@"C:\OCR_DLL\Windows.Foundation.UniversalApiContract.winmd"</span>; <span>// путь к вашему файлу</span><br> <span>return</span> System.Reflection.Assembly.LoadFile(path);<br> }<br> <span>return</span> <span>null</span>;<br>};<br>
После выполнения этих шагов среда ZennoPoster сможет корректно компилировать и исполнять вызовы Windows Media OCR API.




и там ещё целый набор задач, которые нужно выполнить, для запуска, например, код С#
C#:
Развернуть Свернуть Копировать
// 1. Получаем путь к изображению из переменной ZennoPoster
string imagePath = project.Variables["ImagePath"].Value;

if (!File.Exists(imagePath))
{
    throw new FileNotFoundException("Файл изображения не найден: " + imagePath);
}

// 2. Вложенный асинхронный метод распознавания
Func<string, Task<string>> recognizeTextAsync = async (filePath) =>
{
    // Открываем файл как StorageFile Windows Runtime
    StorageFile file = await StorageFile.GetFileFromPathAsync(filePath);
    
    using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
    {
        // Декодируем изображение
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
        SoftwareBitmap bitmap = await decoder.GetSoftwareBitmapAsync();

        // Создаем OCR движок (язык по умолчанию в системе или явно: new Language("ru") / new Language("en"))
        OcrEngine ocrEngine = OcrEngine.TryCreateFromLanguage(new Language("ru"));
        if (ocrEngine == null)
        {
            // Если языковой пакет "ru" не установлен в Windows, пробуем системный язык по умолчанию
            ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();
        }

        if (ocrEngine == null)
        {
            throw new Exception("Не удалось инициализировать OcrEngine. Проверьте установленные языковые пакеты Windows.");
        }

        // Выполняем распознавание
        OcrResult result = await ocrEngine.RecognizeAsync(bitmap);
        
        // Возвращаем полный распознанный текст
        return result.Text;
    }
};

// 3. Синхронный вызов для ZennoPoster (.GetAwaiter().GetResult())
string extractedText = recognizeTextAsync(imagePath).GetAwaiter().GetResult();

// Возвращаем результат в переменную ZennoPoster
project.Variables["OCR_Result"].Value = extractedText;

return extractedText;
 
Winners worldwide won 3.2M last week. Your jackpot is ready! Start Spinning Here -> psee.io/8rka62
 

Кто просматривает тему: (Всего: 1, Пользователи: 1, Гости: 0)