Появился новый детектор – multiscanner. Он работает по другому принципу, чем другие детекторы ActiveCV (ActiveCV - это подсистема Simple, которая позволяет организовать альтернативный интерфейс в дополненной реальности и выводить учетные данные в видеопоток). В других детекторах заранее готовятся списки отображаемых объектов (green_list, object_caption_list), и он потом их выводит. А тут по-другому – он захватывает объекты и все, что в объекте – штрихкоды и надписи, и генерирует события по ним, обрабатываемые уже на стороне обработчиков непрерывно.
Т.е. ему важно связать в единую сущность объект материального мира, штрихкоды (если есть в нем) в нем и текст (если есть в нем). Это нужно для того, чтобы, например, захватить табличку оборудования и прочитать поля, которые в ней, или распознать ценник/этикетку, при этом не хватать текст, который есть в кадре вообще, а только в границах объекта.
Далее для простоты рассуждений будем рассматривать пример с ценником. Будем решать задачу прайсчекера: найти ценник, определить по БД, что это за товар, вывести над ценником надпись с названием товара и ожидаемой ценой и далее попытаться найти эту цену в ценнике и если она нашлась – покрасить в зеленый ну и как-нибудь пикнуть.
Уже из постановки задачи видно, что цену и штрихкод надо искать не где попало, а внутри ценника. Поэтому – multiscanner.
Первый подход – сканирование всего объекта без ограничений
Допустим, нам надо распознать такой ценник. Ценники могут быть разные (с разными макетами), мы не знаем, где находится штрихкод и цена.
Если ничего не настраивать, multiscanner работает так:
- Выделяет на экране объекты
- По каждому объекту ищет все штрихкоды/QR и отправляет в обработчики - это бесконечный цикл, он постоянно сканирует и генерирует события
Далее, согласно логике обработчика, объект может быть подсвечен разными цветами и выведены соответствующие надписи.
Все бы ничего, да вот беда – OCR (распознавание текста) работает медленно и притормаживает видеопоток. Пока еще устройства не такие мощные, чтобы все было плавно.
Поэтому надо стараться включать его только по необходимости.
Цикл работы с каждым ценником такой:
- Найти ценник
- Найти в нем штрихкод
- Проверить по базе. Если есть в БД – покрасить в желтый и оправить искать цену, если нет – покрасить в синий и ничего уже не искать.
- Искать цену, как только нашли – связать с объектом (ценником) результат поиска и прекратить искать цену. Выключить OCR. Покрасить ценник в зеленый цвет.
Достигается это двумя настройками:
- Переменная CVDetectors, может быть равна barcode или ocr (если не задана, то и то, и другое). Таким образом включается общих для всех объектов режим «что искать в объекте?» - штрихкод или текст
- Переменная object_detector_mode – задает уже для конкретного объекта что делать: ocr|barcode|stop Т.е. это имеет более высокий приоритет чем CVDetectors.
Параметры задаются в виде JSON-массива объектов вида: [{“object_id”:<ИД Объекта>, "mode":"barcode|ocr|stop" }]
Таким образом получается, что для каждого ценника проходит цикл Штрихкод-Текст-Стоп, если задать сначала CVDetectors=barcode, а потом object_detector_mode ocr, потом stop
Также появилось еще 2 общие флага настройки:
- CVSingleDetector – позволяет включить режим захвате в кадре только одного объекта – самого заметного. По умолчанию – до 5 объектов
- CVSkipNested – позволяет игнорировать объекты, вложенные в другие объекты
На этом подходе реализован пример простого прайс чекера, который прикреплен к этой статье. Кстати, он реализован не как конфигурация, а как suip-файл, т.е. 1С делает файл в котором и данные о товарах и ценах и сама конфигурация. На устройстве достаточно, чтобы стоял Simple последней версии 11.55.20.
Как им пользоваться:
- Открыть обработку ГенерацияПрайсЧекера.epf в УТ11/КА2/ERP2 или другой похожей конфигурации
- Выбрать тип цен и выгрузить файл
- Отправить на устройство любым способом – мессенджер, почта и т.д.
- Открыть его как текст с помощью SimpleUI (именно открыть, не поделиться)
Ну а как это работает – на гифке - выше.
Важно! Это полностью автоматический прайсчекер, т.е. сканирует еще и цену, а это ресурсоемкая операция - плавно такое работает только на мощных телефонах, с хорошими процессорами и графическими сопроцессорами. Для более слабых девайсов можно отключить OCR в коде - вывод будет только штрихкодов и учетной информации
Второй подход – шаблон ценника
Первый подход – универсальный, сработает со всеми форматами объектов. Но можно настроить шаблон так, чтобы он искал штрихкод и считывал данные только из определенных полей. Т.е. на экране будут нарисованы поля, и оператор должен совместить изображение так, чтобы данные попадали в поля. Особенно это актуально для считывания не ценников, а всяких табличек, где есть много полей.
Шаблон рисуется в «Векторном редакторе» в Simple. Полученный файл указывается в процессе в поле mask. Все поля в векторном редакторе рисуются прямоугольниками. Они могут иметь метку (price, barcode и т.д.), могут начинаться с префикса barcode: (“barcode:<метка>”) – что говорит, что в данном поле надо сканировать штрихкод/QR.
Тут есть один нюанс, о истории борьбы с которым я написал отдельный пост: https://telegra.ph/Anons-novoj-fichi-dlya-ActiveCV-02-22
Там же есть видео, как это работает.
В двух словах: все дело в пропорциях – рамки должны быть пропорциональны объекту.
Поэтому при таком подходе в векторном редакторе сначала рисуется прямоугольник c меткой object (зарезервированное слово), а внутри него уже поля, которые надо отсканировать.
Работает это так: мультисканнер ищет объекты примерно с такими же пропорциями как object. Найдя, рисует рамки. В этих рамках он начинает сканировать то, что ему указали (либо barcode, либо текст).
Просто рамки
Если сделать шаблон, но не рисовать в нем object, а нарисовать просто одну рамку и указать его потом в процессе в mask, то тогда она будет всегда нарисована на экране и будет происходить сканирование только в этой рамке, а за ее пределами не будет. Т.е. это как бы прицел такой.
Фото в процессе работы ActiveCV
ActiveCV создавался как альтернатива традиционному экранному интерфейсу и один из его принципов – бесшовность/непрерывность. Т.е. водишь камерой и все учетные процессы происходят без необходимости куда-то что-то переключать и нажимать.
И вот теперь, находясь в процессе ActiveCV, можно делать фото прямо из видеопотока. Т.е., например, у вас на ActiveCV сделана инвентаризация, вы считали товар и тут же сделали фото.
Это можно запускать как из обработчика (например, считали товар, послали CVCaptureImage и сделалось фото, привязалось к этому товару), так и повесить, например, на кнопку на экране. Но самое лучшее применение – делать снимок автоматом из обработчика, по какому-то событию.
За фото отвечает команда CVCaptureImage, когда она попадает в поток выполнения, происходит снимок и само фото пишется в файл, а ссылку на файл можно получить в CVCaptureResult в переменной CVCaptureFile.
Фото делается, разумеется, всего, что в данный момент попало в кадр.
Основная статья, где есть файл с комплектом разработчика, с примерами к этой статье: //infostart.ru/1c/tools/1153616/
Телеграмм-канал проекта, в котором масса всего полезного: https://t.me/devsimpleui