Как работать с API в Python
Aspose.OMR FOSS для публичного API Python (omr.api) намеренно небольшая: OmrEngine, TemplateProcessor, ImageCollection и FormValidationLogic. Это руководство показывает, как они сочетаются в рабочем процессе генерации и распознавания.
Пошаговое руководство
Шаг 1: Установите пакет
git clone https://github.com/aspose-omr-foss/Aspose.OMR-FOSS-for-Python.git
cd Aspose.OMR-FOSS-for-Python
pip install -e .python -c "import omr; print('Aspose.OMR FOSS for Python is ready.')"Шаг 2: Импортируйте необходимые классы
from omr.api import OmrEngine, FormValidationLogicШаг 3: Сгенерируйте и сохраните шаблон
engine = OmrEngine()
gen = engine.Generate("final-exam.txt")
gen.Save("out", "final-exam")Шаг 4: Загрузить шаблон для распознавания
Передайте FormValidationLogic.Exception вместо значения по умолчанию Ignore, если вы хотите, чтобы нарушение вызывало ошибку для вопросов с отключённым множественным выбором, а не принималось молча.
processor = engine.GetTemplateProcessor("out/final-exam.omr", FormValidationLogic.Exception)Шаг 5: Распознать и экспортировать
result = processor.Recognize("scan.png")
print(result.GetCsv())Распространённые проблемы и решения
FormValidationLogic.Exception никогда не генерирует исключение, даже в вопросе с несколькими отмеченными вариантами. Проверка срабатывает только для вопроса с Multiselect отключено; GlobalPageSettings.Multiselect по умолчанию включено, поэтому убедитесь, что оно явно отключено для вопроса, который вы ожидаете как одновыборный.
Мне нужно распознавать множество сканов одновременно. Используйте TemplateProcessor.RecognizeFolder(folderPath, recognitionThreshold) вместо вызова Recognize() в цикле.
Я зарегистрировал изображение под именем, которое уже использовано. ImageCollection.Add не перезаписывает — проверьте Contains(name) сначала, либо используйте уникальное имя для каждого изображения.
Часто задаваемые вопросы
Безопасно ли использовать OmrEngine повторно в нескольких шаблонах?
Да — он без состояния.
Как переоценить результат с другим порогом без повторного сканирования?
Вызовите TemplateProcessor.Recalculate(result, recognitionThreshold).
Как встроить изображение из памяти в разметку вместо чтения с диска?
Зарегистрируйте его в ImageCollection.Add(name, image_bytes), затем ссылайтесь на него в разметке как ?image=<name>.