numpy, opencv-python, và Pillow. Một OmrEngine duy nhất bao phủ toàn bộ quy trình — Generate() chuyển một mẫu, được xây dựng theo code-first từ cây TemplateConfig gồm các phần tử như ChoiceBoxConfig, CheckBoxConfig, GridConfig, và AnswerSheetConfig, hoặc được viết bằng một DSL đánh dấu văn bản gọn gàng, thành một hình ảnh trang cộng với mô tả .omr; GetTemplateProcessor() tải mô tả đó lại để nhận dạng các ảnh quét mới bằng Recognize() hoặc RecognizeFolder(), trả về kết quả có thể xuất ra CSV, JSON, hoặc XML. Thư viện được cấp phép MIT và cài đặt bằng một lệnh pip duy nhất (xem bên dưới); đây là bản phát hành sớm (v0.1.0, Development Status: Alpha) bao gồm các lớp nền tảng, tạo và nhận dạng của toàn bộ bề mặt Aspose.OMR — việc hiển thị trong bản phát hành này chỉ hỗ trợ LTR/Tây, các hệ thống viết RTL và xử lý tràn đầy đủ đang được theo dõi trên lộ trình upstream nhưng chưa được triển khai. Đối với dòng sản phẩm doanh nghiệp, xem Aspose.OMR — Enterprise Product Family.TemplateConfig, PageConfig, và các cấu hình phần tử (ChoiceBoxConfig, CheckBoxConfig, GridConfig, CompositeGridConfig, AnswerSheetConfig) mô tả mọi trường trên trang.?choicebox=... / &choicebox) tạo ra các cấu trúc tương tự mà không cần tạo đối tượng thủ công.Arabic, Hebrew, Persian, Urdu, Bengali, và Western có sẵn để đạt độ trung thực API với bề mặt Aspose.OMR; bộ render của phiên bản này chỉ hỗ trợ LTR/Western — render RTL chưa được triển khai.LongWordHandling và các lớp con của OverflowAction (Clip, NoClip, Wrap) được phân tích và xác thực đúng, nhưng bộ render của phiên bản này chưa tôn trọng chúng — hành vi overflow thực tế chưa khả cấu hình.CheckBoxConfig và ChoiceBoxConfig hỗ trợ đa lựa chọn; FormValidationLogic, được thiết lập một lần cho mỗi TemplateProcessor, có thể gây lỗi nếu một câu hỏi với Multiselect bị tắt nhận được nhiều hơn một dấu.AnswerSheetConfig để thu thập phản hồi quy mô lớn.GridConfig và CompositeGridConfig ghi lại các mục nhập số hoặc ký hiệu tùy chỉnh thành một giá trị hợp nhất.Save() ghi một trang PNG sẵn sàng để in cùng với mô tả .omr được dùng cho việc nhận dạng sau này.RecognizeFolder() xử lý toàn bộ thư mục các bản quét trong một lần gọi.OmrEngine.Generate() tạo ra một GenerationResult (hình ảnh trang + mẫu .omr JSON); GetTemplateProcessor() tải mẫu đó để nhận dạng các bản scan mới.RecognitionResult xuất ra CSV, JSON, hoặc XML, mỗi định dạng có một biến thể stream tương ứng.MemoryGenerationResult cung cấp các hình ảnh đã tạo dưới dạng streams trong bộ nhớ thông qua GetImages()/GetOmr() — không cần I/O đĩa.Recalculate() áp dụng lại ngưỡng khác mà không cần quét lại.ImageCollection cho phép markup tham chiếu các byte hình ảnh trong bộ nhớ bằng tên, tránh việc di chuyển qua hệ thống tập tin.Aspose.OMR FOSS for Python được cài đặt bằng một lệnh pip duy nhất (xem ví dụ Quick Start bên dưới). Phần API tập trung vào ba đối tượng — OmrEngine, một cây TemplateConfig (hoặc DSL markup), và TemplateProcessor — bao phủ toàn bộ quy trình tạo → quét → nhận dạng → xuất workflow.
Thư viện chỉ phụ thuộc vào numpy, opencv-python và Pillow — không có binary OMR gốc nào cần biên dịch. Nó được cấp phép MIT, lưu trữ trên GitHub, và hiện đang ở bản phát hành sớm v0.1.0, bao gồm các lớp nền tảng, tạo và nhận dạng của toàn bộ bề mặt Aspose.OMR.
Xây dựng (hoặc tải) một mẫu, lưu hình ảnh trang đã tạo và mô tả .omr, sau đó nhận dạng bản scan và xuất kết quả dưới dạng 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 đánh dấu văn bản xây dựng cùng cây phần tử như API kiểu code-first. Ở đây ?choicebox=... mở một câu hỏi choice-box, dòng tiếp theo liệt kê các tùy chọn của nó, và &choicebox đóng lại — Generate() trả về một mô tả .Template JSON mà bạn có thể kiểm tra trực tiếp.
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']
Nó được phân phối theo Giấy phép MIT — miễn phí sử dụng, sửa đổi và phân phối, bao gồm trong các sản phẩm thương mại, với điều kiện bao gồm thông báo bản quyền gốc.
Python 3.10 hoặc sau này, với ba phụ thuộc được cài đặt tự động bằng pip — numpy, opencv-python, và Pillow. Không cần phần cứng OMR gốc hoặc dịch vụ bên ngoài.
Không có trong phiên bản này. GenerationResult.SaveAsPdf() và MemoryGenerationResult.GetPDF() đều gây ra NotImplementedError. Sử dụng đầu ra PNG từ Save() hoặc GetImages() thay thế.
RecognitionResult xuất ra CSV, JSON, hoặc XML thông qua GetCsv(), GetJson() và GetXml(), mỗi cái có một biến thể luồng trong bộ nhớ tương ứng.
Chưa hỗ trợ việc render. Lớp mẫu định nghĩa các hệ thống viết Arabic, Hebrew, Persian, Urdu và Bengali để đảm bảo độ chính xác với bề mặt Aspose.OMR, nhưng engine render của bản phát hành này chỉ hỗ trợ LTR/Western — việc render RTL và thiết kế chữ số bản địa đang nằm trong lộ trình upstream, chưa được triển khai.
Có, đối với các câu hỏi được cấu hình với Multiselect bị tắt. Đưa FormValidationLogic.Exception vào GetTemplateProcessor() để gây ra lỗi khi một câu hỏi như vậy nhận được hơn một dấu; mặc định, Ignore, sẽ chấp nhận một cách im lặng. GlobalPageSettings.Multiselect mặc định là bật.