Biblioteca Java OMR

Você precisa de uma biblioteca Java OMR simples, mas rica em recursos? Deseja reconhecer marcas ópticas em imagens digitalizadas? Experimente Aspose.OMR for Java - Uma biblioteca de classes Java para executar as operações de Optical Mark Recognition (OMR) em aplicativos baseados em Java. Vamos dar uma rápida olhada nos recursos da referida API Java para ver como reconhecer marcas ópticas em uma variedade de formatos de imagem e capturar dados marcados por humanos de pesquisas, questionários ou testes contendo MCQs.

Criar modelo OMR dinamicamente usando a biblioteca Java OMR

O Aspose.OMR para Java fornece um conjunto completo de recursos, desde a criação do modelo OMR até o reconhecimento das marcas ópticas para capturar os dados. A API oferece suporte à geração do arquivo de modelo OMR ou da imagem a partir de marcações de texto simples. Você pode simplesmente passar a marcação de texto do modelo para a API e ela gerará o modelo para você. Veja a seguir uma marcação de texto de exemplo para um modelo 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________________________________

Você pode simplesmente salvar a marcação de texto em um arquivo de texto com extensão .txt. Uma vez feito, você pode gerar o modelo usando as seguintes etapas:

O exemplo de código a seguir mostra como gerar o modelo OMR da marcação de texto usando 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++)
{
    // geração de modelo de chamada fornecendo caminho para o arquivo txt com marcação
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // verifique em caso de erros
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // salvar o resultado da geração: imagem e modelo .omr
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

Resultado

Biblioteca Java OMR

Optical Mark Recognition (OMR) em imagens usando Java

Para executar o OMR em imagens, você só precisa de duas coisas - o modelo OMR preparado (.omr) e as imagens (formulários/folhas preenchidos pelo usuário) para executar o OMR. A API oferece suporte ao OMR para os seguintes formatos de imagem:

A seguir estão as etapas para realizar o OMR em imagens:

O exemplo de código a seguir mostra como reconhecer marcas óticas em imagens usando Java.

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

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

// inicialize o mecanismo e obtenha o processador de modelo fornecendo o caminho para o arquivo .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// loop de imagens
for (int i = 0; i < UserImages.length; i++) {
    // caminho para a imagem a ser reconhecida
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // reconhecer imagem e receber resultado
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // exportar resultados como string csv
    String csvResult = result.getCsv();

    String json = result.getJson();

    // salve csv na pasta de saída
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Usando um limite de reconhecimento personalizado para OMR

Você também pode ajustar os resultados do OMR definindo um limite personalizado entre 0 e 100. Aumentar o limite torna a API mais rigorosa no reconhecimento das respostas. Os valores de limite podem ser definidos no método TemplateProcessor.recognizeImage() como o segundo parâmetro, conforme mostrado no exemplo de código Java a seguir.

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

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

// inicialize o mecanismo e obtenha o processador de modelo fornecendo o caminho para o arquivo .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// loop de imagens
for (int i = 0; i < UserImages.length; i++) {
    // caminho para a imagem a ser reconhecida
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // reconhecer imagem e receber resultado
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

    // exportar resultados como string csv
    String csvResult = result.getCsv();

    String json = result.getJson();

    // salve csv na pasta de saída
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Recalculando os resultados do OMR

Em alguns casos, você pode querer recalcular os resultados de OMR com diferentes valores de limite. Em vez de chamar TemplateProcessor.recognizeImage() repetidamente nesses casos, você pode configurar a API para recálculo automático usando o método TemplateProcessor.recalculate() para melhorar a eficiência do processamento da imagem. O exemplo de código a seguir mostra como implementar o recálculo dos resultados do OMR.

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

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

// init engine e obtenha o processador de modelo
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// Definir limite personalizado para usar no recálculo
// este valor está no intervalo (0 a 100)
// representa a porcentagem de pixels pretos necessários na imagem da bolha a ser reconhecida
// ou seja, quanto menor o valor - menos pixels pretos são necessários para que a bolha seja contada como preenchida e vice-versa
int CustomThreshold = 40;

// loop de imagens
for (int i = 0; i < UserImages.length; i++)
{
    String image = UserImages[i];
    String imagePath = image;
    System.out.println("Processing image: " + imagePath);

    // reconhecer imagem
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // obter string csv de exportação
    String stringRes = result.getCsv();

    // salvar csv na pasta de saída
    String outputName = UserImagesNoExt[i] + ".csv";

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

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

    // recalcular resultados de reconhecimento com limite personalizado
    templateProcessor.recalculate(result, CustomThreshold);

    // obter string csv de exportação
    stringRes = result.getCsv();

    // salvar resultados recalculados
    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();
}

Caso você tenha dúvidas ou perguntas relacionadas à nossa biblioteca Java OMR, entre em contato conosco através do nosso fórum para quaisquer perguntas ou dúvidas.

Veja também