numpy, opencv-python i Pillow. Jednolity OmrEngine obejmuje cały przepływ pracy — Generate() zamienia szablon, zbudowany najpierw w kodzie z drzewa TemplateConfig elementów takich jak ChoiceBoxConfig, CheckBoxConfig, GridConfig i AnswerSheetConfig, lub zapisany w zwartej DSL tekstowo-znacznikowej, w obraz strony oraz deskryptor .omr; GetTemplateProcessor() wczytuje ten deskryptor ponownie, aby rozpoznawać nowe skany przy użyciu Recognize() lub RecognizeFolder(), zwracając wyniki eksportowalne do CSV, JSON lub XML. Biblioteka jest licencjonowana na licencji MIT i instalowana jednym poleceniem pip (zobacz poniżej); jest wczesną wersją (v0.1.0, Development Status: Alpha) obejmującą warstwy podstawowe, generacji i rozpoznawania pełnej powierzchni Aspose.OMR — renderowanie w tej wersji obsługuje wyłącznie LTR/Western, a systemy pisma RTL oraz pełna obsługa przepełnień są uwzględnione w planie rozwoju, ale jeszcze nie zostały zaimplementowane. W przypadku rodziny produktów enterprise zobacz Aspose.OMR — Enterprise Product Family.TemplateConfig, PageConfig i konfiguracje elementów (ChoiceBoxConfig, CheckBoxConfig, GridConfig, CompositeGridConfig, AnswerSheetConfig) opisują każde pole na stronie.?choicebox=... / &choicebox) tworzy te same struktury bez ręcznego konstruowania obiektów.Arabic, Hebrew, Persian, Urdu, Bengali i Western są dostępne dla API wierności z powierzchnią Aspose.OMR; renderer tej wersji obsługuje tylko LTR/Western — renderowanie RTL nie zostało jeszcze zaimplementowane.LongWordHandling oraz podklasy OverflowAction (Clip, NoClip, Wrap) są poprawnie parsowane i walidowane, ale renderer tej wersji nie honoruje ich jeszcze — rzeczywiste zachowanie przy przepełnieniu nie jest jeszcze konfigurowalne.CheckBoxConfig i ChoiceBoxConfig obsługują wielokrotny wybór; FormValidationLogic, ustawiany raz na TemplateProcessor, może zgłosić błąd, jeśli pytanie z wyłączonym Multiselect otrzyma więcej niż jedną zaznaczoną odpowiedź.AnswerSheetConfig do zbierania odpowiedzi na dużą skalę.GridConfig i CompositeGridConfig przechwytują numeryczne lub niestandardowe symbole jako jedną połączoną wartość.Save() zapisuje gotową do druku stronę PNG obok deskryptora .omr używanego później do rozpoznawania.RecognizeFolder() przetwarza cały folder skanów w jednym wywołaniu.OmrEngine.Generate() tworzy GenerationResult (obraz strony + szablon .omr JSON); GetTemplateProcessor() ładuje ten szablon, aby rozpoznawać nowe skany.RecognitionResult eksportuje do CSV, JSON lub XML, każdy z odpowiednim wariantem strumienia.MemoryGenerationResult udostępnia wygenerowane obrazy jako strumienie w pamięci poprzez GetImages()/GetOmr() — nie wymaga operacji we/wy na dysku.Recalculate() ponownie stosuje inny próg bez ponownego skanowania.ImageCollection umożliwia odwoływanie się w znacznikach do bajtów obrazów w pamięci po nazwie, unikając dodatkowych operacji na systemie plików.Aspose.OMR FOSS for Python instalowany jest jednym poleceniem pip (zobacz przykład Quick Start poniżej). API koncentruje się na trzech obiektach — OmrEngine, drzewie TemplateConfig (lub DSL markup), oraz TemplateProcessor — które obejmują cały przepływ pracy generuj → skanuj → rozpoznawaj → eksportuj.
Biblioteka zależy tylko od numpy, opencv-python i Pillow — nie wymaga natywnych binarek OMR do kompilacji. Jest licencjonowana na licencji MIT, hostowana na GitHubie i obecnie w wczesnym wydaniu v0.1.0, obejmującym warstwy podstawy, generacji i rozpoznawania pełnej powierzchni Aspose.OMR.
Zbuduj (lub wczytaj) szablon, zapisz wygenerowany obraz strony i opisnik .omr, a następnie rozpoznaj zeskanowaną kopię i wyeksportuj wyniki jako 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 oznaczania tekstu buduje to samo drzewo elementów co kod-pierwszy API. Tutaj ?choicebox=... otwiera pytanie typu choice-box, następna linia wymienia jego opcje, a &choicebox zamyka je — Generate() zwraca opis .Template JSON, który można bezpośrednio przejrzeć.
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']
Jest rozpowszechniany na licencji MIT — wolny do użycia, modyfikacji i dystrybucji, w tym w produktach komercyjnych, pod warunkiem dołączenia oryginalnego oświadczenia o prawach autorskich.
Python 3.10 lub nowszy, z trzema zależnościami instalowanymi automatycznie przez pip — numpy, opencv-python i Pillow. Nie wymaga natywnego sprzętu OMR ani zewnętrznych usług.
Nie w tej wersji. GenerationResult.SaveAsPdf() i MemoryGenerationResult.GetPDF() obie zgłaszają NotImplementedError. Użyj wyjścia PNG z Save() lub GetImages() zamiast tego.
RecognitionResult eksportuje do CSV, JSON lub XML za pomocą GetCsv(), GetJson() i GetXml(), każdy z nich ma odpowiadający wariant strumienia w pamięci.
Jeszcze nie gotowe do renderowania. Warstwa szablonu definiuje arabskie, hebrajskie, perskie, urdu i bengalskie systemy pisma w celu zachowania wierności powierzchni Aspose.OMR, ale silnik renderujący w tej wersji obsługuje wyłącznie LTR/Western – renderowanie RTL i typografia cyfr natywnych znajdują się w planie rozwoju upstream, nie zostały jeszcze zaimplementowane.
Tak, dla pytań skonfigurowanych z wyłączonym Multiselect. Przekaż FormValidationLogic.Exception do GetTemplateProcessor(), aby zgłosić wyjątek, gdy takie pytanie otrzyma więcej niż jedno zaznaczenie; domyślnie, Ignore, akceptuje to cicho. GlobalPageSettings.Multiselect domyślnie jest włączony.