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 та повна обробка переповнення знаходяться у дорожній карті upstream, але ще не реалізовані. Для корпоративного сімейства продуктів дивіться 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=... відкриває питання типу choice-box, наступний рядок перераховує його варіанти, а &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, але render engine цього випуску підтримує лише LTR/Western — RTL rendering та набори рідних цифр знаходяться у плані upstream roadmap, ще не реалізовані.
Так, для питань, у яких Multiselect вимкнено. Передайте FormValidationLogic.Exception у GetTemplateProcessor(), щоб викликати виключення, коли таке питання отримує більше однієї позначки; за замовчуванням Ignore приймає це без повідомлення. GlobalPageSettings.Multiselect за замовчуванням увімкнено.