numpy, opencv-python e Pillow. Un singolo OmrEngine copre l’intero flusso di lavoro — Generate() trasforma un modello, costruito code-first da un albero TemplateConfig di elementi come ChoiceBoxConfig, CheckBoxConfig, GridConfig e AnswerSheetConfig, o scritto in un compatto DSL di markup testuale, in un’immagine di pagina più un descrittore .omr; GetTemplateProcessor() carica quel descrittore per riconoscere nuove scansioni con Recognize() o RecognizeFolder(), restituendo risultati esportabili in CSV, JSON o XML. La libreria è rilasciata sotto licenza MIT e si installa con un singolo comando pip (vedi sotto); è un rilascio iniziale (v0.1.0, Development Status: Alpha) che copre le basi, i livelli di generazione e riconoscimento dell’intera superficie Aspose.OMR — il rendering in questa versione è solo LTR/Western, con sistemi di scrittura RTL e gestione completa dell’overflow tracciati nella roadmap upstream ma non ancora implementati. Per la famiglia di prodotti enterprise, vedere Aspose.OMR — Enterprise Product Family.TemplateConfig, PageConfig e le configurazioni degli elementi (ChoiceBoxConfig, CheckBoxConfig, GridConfig, CompositeGridConfig, AnswerSheetConfig) descrivono ogni campo nella pagina.?choicebox=... / &choicebox) costruisce le stesse strutture senza creare oggetti manualmente.Arabic, Hebrew, Persian, Urdu, Bengali e Western sono presenti per la fedeltà API con la superficie Aspose.OMR; il renderer di questa versione è solo LTR/Western — il rendering RTL non è ancora implementato.LongWordHandling e le sottoclassi di OverflowAction (Clip, NoClip, Wrap) analizzano e convalidano correttamente, ma il renderer di questa versione non li rispetta ancora — il comportamento effettivo di overflow non è ancora configurabile.CheckBoxConfig e ChoiceBoxConfig supportano la selezione multipla; FormValidationLogic, impostato una volta per TemplateProcessor, può generare un errore se una domanda con Multiselect disabilitato riceve più di un segno.AnswerSheetConfig per la raccolta di risposte su larga scala.GridConfig e CompositeGridConfig catturano inserimenti numerici o di simboli personalizzati come un unico valore combinato.Save() scrive una pagina PNG pronta per la stampa accanto al descrittore .omr usato per il riconoscimento successivo.RecognizeFolder() elabora un’intera cartella di scansioni in una sola chiamata.OmrEngine.Generate() produce un GenerationResult (immagine della pagina + modello .omr JSON); GetTemplateProcessor() carica quel modello per riconoscere nuove scansioni.RecognitionResult esporta in CSV, JSON, o XML, ciascuno con una variante di stream corrispondente.MemoryGenerationResult espone le immagini generate come stream in memoria tramite GetImages()/GetOmr() — non è richiesto alcun I/O su disco.Recalculate() riapplica una soglia diversa senza dover riscanare.ImageCollection consente al markup di fare riferimento a byte di immagine in memoria per nome, evitando viaggi di andata e ritorno al file system.Aspose.OMR FOSS for Python si installa con un unico comando pip (vedi l’esempio Quick Start qui sotto). Il API si concentra su tre oggetti — OmrEngine, un albero TemplateConfig (o il DSL di markup), e TemplateProcessor — che coprono l’intero flusso di lavoro genera → scansiona → riconosce → esporta.
La libreria dipende solo da numpy, opencv-python e Pillow — nessun binario OMR nativo da compilare. È rilasciata con licenza MIT, ospitata su GitHub, e attualmente in una prima versione v0.1.0 che copre gli strati di fondazione, generazione e riconoscimento dell’intera superficie Aspose.OMR.
Crea (o carica) un modello, salva l’immagine della pagina generata e il descrittore .omr, quindi riconosci una copia scannerizzata ed esporta i risultati in 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()
Il DSL di markup del testo costruisce lo stesso albero di elementi del API basato su codice. Qui ?choicebox=... apre una domanda a scelta multipla, la riga successiva elenca le sue opzioni, e &choicebox la chiude — Generate() restituisce un descrittore .Template JSON che puoi ispezionare direttamente.
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']
È distribuito sotto la MIT License — libero da usare, modificare e distribuire, anche in prodotti commerciali, a condizione di includere l’avviso di copyright originale.
Python 3.10 o successive, con tre dipendenze installate automaticamente da pip — numpy, opencv-python e Pillow. Non è necessario alcun hardware OMR nativo o servizi esterni.
Non in questa versione. GenerationResult.SaveAsPdf() e MemoryGenerationResult.GetPDF() sollevano entrambi NotImplementedError. Usa l’output PNG da Save() o GetImages() invece.
RecognitionResult esporta in CSV, JSON o XML tramite GetCsv(), GetJson() e GetXml(), ognuno con una variante di stream in memoria corrispondente.
Non ancora per il rendering. Lo strato del modello definisce i sistemi di scrittura arabo, ebraico, persiano, urdu e bengalese per la fedeltà con la superficie Aspose.OMR, ma il motore di rendering di questa versione è solo LTR/Western – il rendering RTL e l’impaginazione di cifre native sono nella roadmap upstream, non ancora implementati.
Sì, per le domande configurate con Multiselect disabilitato. Passa FormValidationLogic.Exception a GetTemplateProcessor() per sollevare quando una tale domanda riceve più di un segno; il valore predefinito, Ignore, lo accetta silenziosamente. GlobalPageSettings.Multiselect è abilitato per impostazione predefinita.