Библиотека OMR для Java

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

Динамическое создание шаблона OMR с использованием библиотеки Java OMR

Aspose.OMR для 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++)
{
    // генерация шаблона звонка с указанием пути к txt файлу с разметкой
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // проверить в случае ошибок
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

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

Выход

Библиотека OMR для Java

Оптическое распознавание меток (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, свяжитесь с нами через наш форум.

Смотрите также