numpy, opencv-python и Pillow. Один OmrEngine охватывает весь процесс — Generate() преобразует шаблон, созданный кодом из дерева TemplateConfig элементов, таких как ChoiceBoxConfig, CheckBoxConfig, GridConfig и AnswerSheetConfig, или написанный в компактном DSL разметки текста, в изображение страницы и дескриптор .omr; GetTemplateProcessor() загружает этот дескриптор для распознавания новых сканов с помощью Recognize() или RecognizeFolder(), возвращая результаты, экспортируемые в CSV, JSON или XML. Библиотека лицензирована по MIT и устанавливается одной командой pip (см. ниже); это ранний релиз (v0.1.0, Development Status: Alpha), охватывающий фундамент, генерацию и слои распознавания полной поверхности Aspose.OMR — рендеринг в этом выпуске поддерживает только LTR/Western, а поддержка RTL-писем и полноценной обработки переполнения находится в дорожной карте, но ещё не реализована. Для семейства корпоративных продуктов смотрите Aspose.OMR — Enterprise Product Family.TemplateConfig, PageConfig и конфигурации элементов (ChoiceBoxConfig, CheckBoxConfig, GridConfig, CompositeGridConfig, AnswerSheetConfig) описывают каждое поле на странице.?choicebox=... / &choicebox) создает те же структуры без ручного создания объектов.Arabic, Hebrew, Persian, Urdu, Bengali и Western присутствуют для API точности с Aspose.OMR поверхностью; рендерер этой версии поддерживает только LTR/Western — RTL-рендеринг пока не реализован.LongWordHandling и подклассы OverflowAction (Clip, NoClip, Wrap) правильно разбираются и проверяются, но рендерер этой версии пока их не учитывает — реальное поведение при переполнении пока не настраивается.CheckBoxConfig и ChoiceBoxConfig поддерживают множественный выбор; FormValidationLogic, задаваемый один раз для TemplateProcessor, может вызвать ошибку, если вопрос с отключённым Multiselect получает более одной отметки.AnswerSheetConfig для массового сбора ответов.GridConfig и CompositeGridConfig фиксируют числовые или пользовательские символы как одно объединённое значение.Save() записывает готовую к печати страницу PNG рядом с дескриптором .omr, используемым для последующего распознавания.RecognizeFolder() обрабатывает всю папку сканов за один вызов.OmrEngine.Generate() создает GenerationResult (изображение страницы + шаблон .omr JSON); GetTemplateProcessor() загружает этот шаблон для распознавания новых сканов.RecognitionResult экспортирует в CSV, JSON или XML, каждый с соответствующим вариантом потока.MemoryGenerationResult предоставляет сгенерированные изображения как потоки в памяти через GetImages()/GetOmr() — дисковый ввод/вывод не требуется.Recalculate() повторно применяет другой порог без повторного сканирования.ImageCollection позволяет разметке ссылаться на байты изображения в памяти по имени, избегая обращений к файловой системе.Aspose.OMR FOSS for Python устанавливается одной командой pip (см. пример Quick Start ниже). API сосредоточен на трёх объектах — OmrEngine, дереве TemplateConfig (или DSL разметки) и TemplateProcessor — которые охватывают весь процесс генерации → сканирования → распознавания → экспорта.
Библиотека зависит только от numpy, opencv-python и Pillow — никаких нативных бинарных файлов OMR для компиляции. Она лицензирована по MIT, размещена на GitHub и в настоящее время находится в раннем релизе v0.1.0, покрывающем базовый, генерационный и распознающий уровни полной поверхности Aspose.OMR.
Создайте (или загрузите) шаблон, сохраните сгенерированное изображение страницы и дескриптор .omr, затем распознайте отсканированную копию и экспортируйте результаты в CSV.
git clone https://github.com/aspose-omr-foss/Aspose.OMR-FOSS-for-Python.git
cd Aspose.OMR-FOSS-for-Python
pip install -e .from omr.api import OmrEngine, FormValidationLogic
engine = OmrEngine()
gen = engine.Generate("final-exam.txt") # or a code-first TemplateConfig
gen.Save("out", "final-exam") # -> out/final-exam.png + out/final-exam.omr
processor = engine.GetTemplateProcessor("out/final-exam.omr", FormValidationLogic.Ignore)
result = processor.Recognize("scan.png") # -100 = auto-calibrated threshold
print(result.GetCsv()) # also GetJson() / GetXml()
DSL разметки текста создает то же дерево элементов, что и код-ориентированный API. Здесь ?choicebox=... открывает вопрос с выбором, следующая строка перечисляет его варианты, а &choicebox закрывает его — Generate() возвращает дескриптор .Template JSON, который можно изучить напрямую.
import json
from omr.api import OmrEngine
markup = [
"?choicebox=Rate it",
"(1) Poor (2) Fair (3) Good",
"&choicebox",
]
engine = OmrEngine()
result = engine.Generate(markup)
desc = json.loads(result.Template)
cb = desc["Pages"][0]["Elements"][0]
print([b["Value"] for b in cb["Fields"][0]["Bubbles"]]) # ['Poor', 'Fair', 'Good']
Он распространяется под лицензией MIT — свободно использовать, модифицировать и распространять, включая коммерческие продукты, при условии включения оригинального уведомления об авторском праве.
Python 3.10 или новее, с тремя зависимостями, устанавливаемыми автоматически через pip — numpy, opencv-python и Pillow. Никакое собственное оборудование OMR или внешние сервисы не требуются.
В этом выпуске нет. GenerationResult.SaveAsPdf() и MemoryGenerationResult.GetPDF() оба вызывают NotImplementedError. Используйте PNG-вывод из Save() или GetImages() вместо этого.
RecognitionResult экспортирует в CSV, JSON или XML с помощью GetCsv(), GetJson() и GetXml(), каждый с соответствующим вариантом потока в памяти.
Еще не готово к рендерингу. Слой шаблона определяет арабскую, ивритскую, персидскую, урду и бенгальскую системы письма для соответствия поверхности Aspose.OMR, но в этом выпуске движок рендеринга поддерживает только LTR/Western — рендеринг RTL и набор нативных цифр находятся в дорожной карте upstream, но пока не реализованы.
Да, для вопросов, у которых отключён Multiselect. Передайте FormValidationLogic.Exception в GetTemplateProcessor(), чтобы вызвать исключение, когда такой вопрос получает более одной отметки; значение по умолчанию, Ignore, принимает её без предупреждения. GlobalPageSettings.Multiselect по умолчанию включён.