numpy, opencv-python e Pillow. Um único OmrEngine cobre todo o fluxo de trabalho — Generate() converte um modelo, construído primeiro em código a partir de uma árvore TemplateConfig de elementos como ChoiceBoxConfig, CheckBoxConfig, GridConfig e AnswerSheetConfig, ou escrito em uma DSL de marcação de texto compacta, em uma imagem de página mais um descritor .omr; GetTemplateProcessor() carrega esse descritor novamente para reconhecer novas digitalizações com Recognize() ou RecognizeFolder(), retornando resultados exportáveis para CSV, JSON, ou XML. A biblioteca tem licença MIT e é instalada com um único comando pip (veja abaixo); é um lançamento inicial (v0.1.0, Status de Desenvolvimento: Alpha) que cobre as camadas de fundação, geração e reconhecimento da superfície completa do Aspose.OMR — a renderização nesta versão é apenas LTR/ocidental, com sistemas de escrita RTL e tratamento completo de overflow rastreados no roadmap upstream, mas ainda não implementados. Para a família de produtos empresariais, veja Aspose.OMR — Enterprise Product Family.TemplateConfig, PageConfig, e configs de elemento (ChoiceBoxConfig, CheckBoxConfig, GridConfig, CompositeGridConfig, AnswerSheetConfig) descrevem cada campo na página.?choicebox=... / &choicebox) cria as mesmas estruturas sem a necessidade de construir objetos manualmente.Arabic, Hebrew, Persian, Urdu, Bengali e Western estão presentes para fidelidade API com a superfície Aspose.OMR; o renderizador desta versão é apenas LTR/Western — a renderização RTL ainda não foi implementada.LongWordHandling e as subclasses de OverflowAction (Clip, NoClip, Wrap) são analisadas e validadas corretamente, mas o renderizador desta versão ainda não as respeita — o comportamento real de overflow ainda não é configurável.CheckBoxConfig e ChoiceBoxConfig suportam seleção múltipla; FormValidationLogic, definido uma vez por TemplateProcessor, pode gerar erro se uma pergunta com Multiselect desativado receber mais de uma marca.AnswerSheetConfig para coleta de respostas em larga escala.GridConfig e CompositeGridConfig capturam entradas numéricas ou de símbolos personalizados como um valor mesclado.Save() grava uma página PNG pronta para impressão ao lado do descritor .omr usado para reconhecimento posterior.RecognizeFolder() processa uma pasta inteira de digitalizações em uma única chamada.OmrEngine.Generate() produz um GenerationResult (imagem da página + modelo .omr JSON); GetTemplateProcessor() carrega esse modelo para reconhecer novas digitalizações.RecognitionResult exporta para CSV, JSON, ou XML, cada um com uma variante de stream correspondente.MemoryGenerationResult expõe as imagens geradas como streams em memória via GetImages()/GetOmr() — sem necessidade de I/O em disco.Recalculate() reaplica um limiar diferente sem re-digitalizar.ImageCollection permite que a marcação referencie bytes de imagem em memória por nome, evitando idas ao sistema de arquivos.Aspose.OMR FOSS for Python instala com um único comando pip (veja o exemplo de Quick Start abaixo). O API centra-se em três objetos — OmrEngine, uma árvore TemplateConfig (ou a DSL de marcação), e TemplateProcessor — que cobrem todo o fluxo gerar → escanear → reconhecer → exportar.
A biblioteca depende apenas de numpy, opencv-python e Pillow — sem binários nativos de OMR para compilar. Ela tem licença MIT, está hospedada no GitHub e atualmente está em um lançamento inicial v0.1.0 que cobre as camadas de fundação, geração e reconhecimento da superfície completa do Aspose.OMR.
Crie (ou carregue) um modelo, salve a imagem da página gerada e o descritor .omr, então reconheça uma cópia digitalizada e exporte os resultados como 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()
O DSL de marcação de texto constrói a mesma árvore de elementos que o API code-first. Aqui ?choicebox=... abre uma pergunta de caixa de escolha, a linha seguinte lista suas opções e &choicebox a fecha — Generate() devolve um descritor .Template JSON que você pode inspecionar diretamente.
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']
É distribuído sob a Licença MIT — livre para usar, modificar e distribuir, inclusive em produtos comerciais, sujeito à inclusão do aviso de direitos autorais original.
Python 3.10 ou posterior, com três dependências instaladas automaticamente pelo pip — numpy, opencv-python e Pillow. Nenhum hardware OMR nativo ou serviços externos são necessários.
Não nesta versão. GenerationResult.SaveAsPdf() e MemoryGenerationResult.GetPDF() ambos levantam NotImplementedError. Use a saída PNG de Save() ou GetImages() em vez disso.
RecognitionResult exporta para CSV, JSON ou XML via GetCsv(), GetJson() e GetXml(), cada um com uma variante de fluxo em memória correspondente.
Ainda não para renderização. A camada de modelo define os sistemas de escrita Árabe, Hebraico, Persa, Urdu e Bengali para fidelidade com a superfície Aspose.OMR, mas o motor de renderização desta versão é apenas LTR/Western – a renderização RTL e a tipografia de dígitos nativos estão na roadmap upstream, ainda não implementadas.
Sim, para perguntas configuradas com Multiselect desativado. Passe FormValidationLogic.Exception para GetTemplateProcessor() para gerar uma exceção quando tal pergunta receber mais de uma marca; o padrão, Ignore, aceita silenciosamente. GlobalPageSettings.Multiselect tem como padrão habilitado.