Thư viện Java OMR

Bạn có cần một thư viện Java OMR đơn giản nhưng giàu tính năng không? Bạn có muốn nhận dạng các dấu hiệu quang học trong hình ảnh được quét không? Hãy thử Aspose.OMR for Java - Một thư viện lớp Java để thực hiện các thao tác Nhận dạng nhãn hiệu quang học (OMR) trong các ứng dụng dựa trên Java. Chúng ta hãy xem nhanh các tính năng của API Java nói trên để xem cách nhận dạng nhãn hiệu quang học ở nhiều định dạng hình ảnh khác nhau và thu thập dữ liệu do con người đánh dấu từ các cuộc khảo sát, bảng câu hỏi hoặc bài kiểm tra có chứa MCQ.

Tự động tạo Mẫu OMR bằng Thư viện Java OMR

Aspose.OMR for Java cung cấp một bộ tính năng hoàn chỉnh từ việc tạo mẫu OMR đến nhận dạng các nhãn hiệu quang học để thu thập dữ liệu. API hỗ trợ tạo tệp mẫu OMR hoặc hình ảnh từ các đánh dấu văn bản đơn giản. Bạn có thể chỉ cần chuyển đánh dấu văn bản của mẫu tới API và nó sẽ tạo mẫu cho bạn. Sau đây là đánh dấu văn bản mẫu cho mẫu OMR.

?text=Name__________________________________ Date____________

?grid=ID
sections_count=8
#What is Aspose.OMR main function?
() OCR() Capture human-marked data
() There is no main function() Enhance images
#Can Aspose.OMR process photos as well?
() Yes, indeed!() No
#Aspose.OMR is available on any platform, because it is:
() Cross-platform code() Cloud service
#Aspose.OMR works with any kind of OMR forms: tests, exams, questionnaires, surveys, etc.
() Yes, indeed!() No
#Excellent recognition results can be achieved only for filled bubbles at least for:
() 40%() 60%() 75%() 98%
#Do you have to mark up every question on the page?
(Yes) Yes, that will help a lot! (No) No
#Rate your preference from 0 to 9 with "0" being preference towards performance
and "9" being preference towards flexibility.
(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)
#I found aspose omr to be a useful tool. (5 - strongly agree, 1 - strongly disagree)
(5) (4) (3) (2) (1)

?text= Answer sheet section
?answer_sheet=MainQuestions
elements_count=10
columns_count=5

?text=Sign________________________________

Bạn có thể chỉ cần lưu đánh dấu văn bản trong tệp văn bản có phần mở rộng .txt. Sau khi hoàn tất, bạn có thể tạo mẫu bằng các bước sau:

Mẫu mã sau đây cho biết cách tạo mẫu OMR từ đánh dấu văn bản bằng Java.

String outputDirectory = "GenerationResult";

String[] GenerationMarkups = new String[] { "Sheet.txt", "Grid.txt", "AsposeTest.txt" };
String[] GenerationMarkupsNoExt = new String[] { "Sheet", "Grid", "AsposeTest" };

OmrEngine engine = new OmrEngine();

for (int i = 0; i < GenerationMarkups.length; i++)
{
    // tạo mẫu cuộc gọi cung cấp đường dẫn đến tệp txt có đánh dấu
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // kiểm tra trong trường hợp có lỗi
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // lưu kết quả tạo: hình ảnh và mẫu .omr
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

đầu ra

Thư viện Java OMR

Nhận dạng dấu quang học (OMR) trong hình ảnh bằng Java

Để thực hiện OMR trong hình ảnh, bạn chỉ cần hai thứ - mẫu OMR đã chuẩn bị sẵn (.omr) và hình ảnh (biểu mẫu/trang tính do người dùng điền) để thực hiện OMR. API hỗ trợ OMR cho các định dạng hình ảnh sau:

Sau đây là các bước để thực hiện OMR trong ảnh:

Mẫu mã sau đây cho biết cách nhận dạng nhãn hiệu quang học trong ảnh bằng Java.

String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };

String outputDirectory = "Result";
String templatePath = "Sheet.omr";

// khởi tạo công cụ và nhận bộ xử lý mẫu cung cấp đường dẫn đến tệp .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// vòng lặp hình ảnh
for (int i = 0; i < UserImages.length; i++) {
    // đường dẫn đến hình ảnh để được công nhận
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // nhận dạng hình ảnh và nhận kết quả
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // xuất kết quả dưới dạng chuỗi csv
    String csvResult = result.getCsv();

    String json = result.getJson();

    // lưu csv vào thư mục đầu ra
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Sử dụng Ngưỡng nhận dạng tùy chỉnh cho OMR

Bạn cũng có thể tinh chỉnh kết quả OMR bằng cách xác định ngưỡng tùy chỉnh trong khoảng từ 0 đến 100. Việc tăng ngưỡng khiến API nghiêm ngặt hơn trong việc nhận dạng câu trả lời. Các giá trị ngưỡng có thể được đặt trong phương thức TemplateProcessor.recognizeImage() làm tham số thứ hai như được hiển thị trong mẫu mã Java sau đây.

String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };

String outputDirectory = "Result";
String templatePath = "Sheet.omr";
int customThreshold = 40;

// khởi tạo công cụ và nhận bộ xử lý mẫu cung cấp đường dẫn đến tệp .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// vòng lặp hình ảnh
for (int i = 0; i < UserImages.length; i++) {
    // đường dẫn đến hình ảnh để được công nhận
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // nhận dạng hình ảnh và nhận kết quả
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

    // xuất kết quả dưới dạng chuỗi csv
    String csvResult = result.getCsv();

    String json = result.getJson();

    // lưu csv vào thư mục đầu ra
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Tính toán lại kết quả OMR

Trong một số trường hợp, bạn có thể muốn tính toán lại kết quả OMR với các giá trị ngưỡng khác nhau. Thay vì gọi đi gọi lại TemplateProcessor.recognizeImage() trong những trường hợp như vậy, bạn có thể định cấu hình API để tính toán lại tự động bằng phương pháp TemplateProcessor.recalculate() để cải thiện hiệu quả xử lý hình ảnh. Mẫu mã sau đây cho biết cách triển khai tính toán lại kết quả OMR.

String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };

String outputDirectory = "Result";
String templatePath = "Sheet.omr";

// init engine và nhận bộ xử lý mẫu
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// Đặt ngưỡng tùy chỉnh để sử dụng trong tính toán lại
// giá trị này nằm trong phạm vi (0 đến 100)
// đại diện cho tỷ lệ phần trăm pixel đen cần thiết trên hình ảnh bong bóng được nhận dạng
// tức là giá trị càng thấp - càng ít pixel đen cần thiết để bong bóng được tính là lấp đầy và ngược lại
int CustomThreshold = 40;

// vòng lặp hình ảnh
for (int i = 0; i < UserImages.length; i++)
{
    String image = UserImages[i];
    String imagePath = image;
    System.out.println("Processing image: " + imagePath);

    // nhận dạng hình ảnh
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // lấy chuỗi csv xuất
    String stringRes = result.getCsv();

    // lưu csv vào thư mục đầu ra
    String outputName = UserImagesNoExt[i] + ".csv";

    PrintWriter wr = new PrintWriter(new FileOutputStream(outputName), true);
    wr.println(stringRes);

    System.out.println("Export done. Path: " + outputName);

    // tính toán lại kết quả nhận dạng với ngưỡng tùy chỉnh
    templateProcessor.recalculate(result, CustomThreshold);

    // lấy chuỗi csv xuất
    stringRes = result.getCsv();

    // lưu kết quả tính toán lại
    outputName = UserImagesNoExt[i] + "_recalculated.csv";

    wr = new PrintWriter(new FileOutputStream(outputName), true);
    wr.println(stringRes);

    System.out.println("Recalculated result export done. Path: " + outputName);
    System.out.println();
}

Trong trường hợp bạn có bất kỳ câu hỏi hoặc thắc mắc nào liên quan đến thư viện Java OMR của chúng tôi, hãy liên hệ với chúng tôi qua diễn đàn của chúng tôi nếu có bất kỳ câu hỏi hoặc thắc mắc nào.

Xem thêm