Aspose.OMR FOSS for Python هي مكتبة مجانية ومفتوحة المصدر لتصميم نماذج OMR (التعرف الضوئي على العلامات) — أوراق إجابة متعددة الخيارات، نماذج صناديق الاختيار، والاستبيانات — والتعرف على العلامات التي يملأها المستجيب من صورة ممسوحة ضوئياً أو مُصورة.
إنها تستهدف المطورين الذين يقومون بأتمتة تصحيح الامتحانات، تجميع الاستبيانات، أو جمع البيانات القائمة على النماذج باستخدام Python النقي، مبنية على لا شيء أكثر غرابة من 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/غربي فقط، مع أن أنظمة الكتابة 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) تُحلل وتتحقق منها بشكل صحيح، لكن عارض هذا الإصدار لا يلتزم بها بعد — سلوك الفائض الفعلي غير قابل للتكوين بعد.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 واحد (انظر مثال البدء السريع أدناه). يركّز API على ثلاثة كائنات — OmrEngine، شجرة TemplateConfig (أو لغة توصيف العلامات DSL)، وTemplateProcessor — التي تغطي كامل سير عمل الإنشاء → المسح → التعرف → التصدير.
تعتمد المكتبة فقط على 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. مرّر FormValidationLogic.Exception إلى GetTemplateProcessor() لتطرح استثناءً عندما يتلقى سؤال كهذا أكثر من علامة واحدة؛ الإعداد الافتراضي، Ignore، يقبل ذلك بصمت. GlobalPageSettings.Multiselect افتراضيًا مفعّل.