Бібліотека Java OMR

Вам потрібна проста, але багатофункціональна бібліотека Java OMR? Бажаєте розпізнавати оптичні сліди на сканованих зображеннях? Спробуйте Aspose.OMR for Java – бібліотеку класів Java для виконання операцій оптичного розпізнавання позначок (OMR) у програмах на основі Java. Давайте коротко познайомимося з функціями згаданого Java API, щоб побачити, як розпізнавати оптичні позначки в різних форматах зображень і отримувати позначені людиною дані з опитувань, анкет або тестів, що містять MCQ.

Динамічно створюйте шаблон OMR за допомогою бібліотеки Java OMR

Aspose.OMR for Java надає повний набір функцій від створення шаблону OMR до розпізнавання оптичних позначок для захоплення даних. API підтримує створення файлу шаблону OMR або зображення з простих текстових розміток. Ви можете просто передати текстову розмітку шаблону в API, і він згенерує шаблон для вас. Нижче наведено приклад текстової розмітки для шаблону 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________________________________

Ви можете просто зберегти текстову розмітку в текстовому файлі з розширенням .txt. Після цього ви можете створити шаблон, виконавши такі кроки:

У наведеному нижче прикладі коду показано, як створити шаблон OMR із текстової розмітки за допомогою 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++)
{
    // створення шаблону виклику, що містить шлях до текстового файлу з розміткою
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // перевірити на випадок помилок
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // зберегти результат генерації: зображення та шаблон .omr
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

Вихід

Бібліотека Java OMR

Оптичне розпізнавання позначок (OMR) у зображеннях за допомогою Java

Щоб виконати OMR у зображеннях, вам потрібні лише дві речі — підготовлений шаблон OMR (.omr) і зображення (заповнені користувачем форми/аркуші), на яких буде виконуватися OMR. API підтримує OMR для таких форматів зображень:

Нижче наведено кроки для виконання OMR у зображеннях.

  • Створіть об’єкт OmrEngine.
  • Створіть об’єкт TemplateProcessor та ініціалізуйте його шляхом до шаблону OMR.
  • Розпізнавайте зображення за допомогою методу TemplateProcessor.recognizeImage() і отримуйте результати у форматі CSV або JSON.

У наведеному нижче прикладі коду показано, як розпізнавати оптичні позначки на зображеннях за допомогою Java.

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

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

// ініціалізувати движок і отримати процесор шаблонів, що містить шлях до файлу .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// цикл зображень
for (int i = 0; i < UserImages.length; i++) {
    // шлях до зображення, яке потрібно розпізнати
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // розпізнати зображення та отримати результат
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // експортувати результати як рядок CSV
    String csvResult = result.getCsv();

    String json = result.getJson();

    // збережіть csv у вихідну папку
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Використання спеціального порогу розпізнавання для OMR

Ви також можете точно налаштувати результати OMR, визначивши настроюване порогове значення від 0 до 100. Збільшення порогового значення робить API більш суворим у розпізнаванні відповідей. Порогові значення можна встановити в методі TemplateProcessor.recognizeImage() як другий параметр, як показано в наступному прикладі коду Java.

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

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

// ініціалізувати движок і отримати процесор шаблонів, що надає шлях до файлу .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// цикл зображень
for (int i = 0; i < UserImages.length; i++) {
    // шлях до зображення, яке потрібно розпізнати
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // розпізнати зображення та отримати результат
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

    // експортувати результати як рядок CSV
    String csvResult = result.getCsv();

    String json = result.getJson();

    // збережіть csv у вихідну папку
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Перерахунок результатів OMR

У деяких випадках ви можете перерахувати результати OMR з іншими пороговими значеннями. Замість виклику TemplateProcessor.recognizeImage() знову і знову в таких випадках ви можете налаштувати API для автоматичного перерахунку за допомогою методу TemplateProcessor.recalculate(), щоб покращити ефективність обробки зображень. У наведеному нижче прикладі коду показано, як реалізувати перерахунок результатів OMR.

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

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

// ініціалізувати механізм і отримати процесор шаблонів
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// Встановіть настроюване порогове значення для використання в перерахунку
// це значення знаходиться в діапазоні (від 0 до 100)
// являє собою відсоток чорних пікселів, необхідних для розпізнавання зображення бульбашки
// тобто чим менше значення, тим менше чорних пікселів потрібно, щоб бульбашка вважалася заповненою, і навпаки
int CustomThreshold = 40;

// цикл зображень
for (int i = 0; i < UserImages.length; i++)
{
    String image = UserImages[i];
    String imagePath = image;
    System.out.println("Processing image: " + imagePath);

    // розпізнати зображення
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // отримати рядок експорту CSV
    String stringRes = result.getCsv();

    // зберегти csv у вихідну папку
    String outputName = UserImagesNoExt[i] + ".csv";

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

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

    // перерахувати результати розпізнавання з настроюваним порогом
    templateProcessor.recalculate(result, CustomThreshold);

    // отримати рядок експорту CSV
    stringRes = result.getCsv();

    // зберегти перераховані результати
    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();
}

Якщо у вас виникнуть будь-які запитання чи запити, пов’язані з нашою бібліотекою Java OMR, зв’яжіться з нами через наш форум із будь-якими запитаннями чи запитами.

Дивись також