numpy، opencv-python و Pillow ساخته شده است. یک OmrEngine واحد تمام جریان کار را پوشش میدهد — Generate() یک قالب را که بهصورت کد-اول از درخت TemplateConfig شامل عناصری مانند ChoiceBoxConfig، CheckBoxConfig، GridConfig و AnswerSheetConfig ساخته شده یا بهصورت DSL متنی فشرده نوشته شده است، به تصویر صفحه بههمراه توصیفگر .omr تبدیل میکند؛ GetTemplateProcessor() آن توصیفگر را بارگذاری میکند تا اسکنهای جدید را با Recognize() یا RecognizeFolder() تشخیص دهد و نتایجی که میتوانند به CSV، JSON یا XML صادر شوند، برگرداند. این کتابخانه تحت مجوز MIT است و با یک فرمان pip نصب میشود (به پایین مراجعه کنید)؛ این یک نسخهٔ اولیه (v0.1.0، وضعیت توسعه: Alpha) است که لایههای پایه، تولید و تشخیص سطح کامل Aspose.OMR را پوشش میدهد — در این نسخه فقط رندرینگ LTR/Western پشتیبانی میشود، در حالی که سیستمهای نوشتاری RTL و مدیریت کامل سرریز در نقشهٔ راه بالادست دنبال میشوند اما هنوز پیادهسازی نشدهاند. برای خانوادهٔ محصولات سازمانی، مراجعه کنید به 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) بهدرستی تجزیه و اعتبارسنجی میشوند، اما رندرر این نسخه هنوز آنها را رعایت نمیکند — رفتار واقعی overflow هنوز قابل تنظیم نیست.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 — متمرکز است که کل جریان کار generate → scan → recognize → export را پوشش میدهد.
این کتابخانه فقط به 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=... یک سؤال جعبهانتخاب را باز میکند، خط بعدی گزینههای آن را فهرست میکند، و &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 تعریف میکند، اما موتور رندر این نسخه فقط LTR/Western است – رندر RTL و تنظیم حروف عددی بومی در برنامهٔ راهبردی بالادستی قرار دارند و هنوز پیادهسازی نشدهاند.
بله، برای پرسشهایی که Multiselect غیرفعال تنظیم شدهاند. Pass FormValidationLogic.Exception به GetTemplateProcessor() برای ایجاد خطا وقتی چنین پرسشی بیش از یک علامت دریافت کرد؛ مقدار پیشفرض، Ignore، بهصورت ساکتانه آن را میپذیرد. GlobalPageSettings.Multiselect بهصورت پیشفرض فعال است.