Biblioteca OMR de Java

¿Necesita una biblioteca Java OMR simple pero rica en funciones? ¿Quiere reconocer marcas ópticas en imágenes escaneadas? Pruebe Aspose.OMR for Java: una biblioteca de clases de Java para realizar operaciones de reconocimiento óptico de marcas (OMR) en aplicaciones basadas en Java. Echemos un vistazo rápido a las características de dicha API de Java para ver cómo reconocer marcas ópticas en una variedad de formatos de imagen y capturar datos marcados por humanos de encuestas, cuestionarios o pruebas que contienen MCQ.

Cree dinámicamente una plantilla OMR utilizando la biblioteca OMR de Java

Aspose.OMR for Java proporciona un conjunto completo de funciones, desde la creación de la plantilla OMR hasta el reconocimiento de las marcas ópticas para capturar los datos. La API admite la generación del archivo de plantilla OMR o la imagen a partir de marcas de texto simples. Simplemente puede pasar el marcado de texto de la plantilla a la API y generará la plantilla por usted. El siguiente es un marcado de texto de muestra para una plantilla 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________________________________

Simplemente puede guardar el marcado de texto en un archivo de texto con extensión .txt. Una vez hecho esto, puede generar la plantilla siguiendo los siguientes pasos:

El siguiente ejemplo de código muestra cómo generar la plantilla OMR a partir del marcado de texto mediante 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++)
{
    // generación de plantilla de llamada que proporciona la ruta al archivo txt con marcado
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // comprobar en caso de errores
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // guardar resultado de generación: imagen y plantilla .omr
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

Producción

Biblioteca OMR de Java

Reconocimiento óptico de marcas (OMR) en imágenes usando Java

Para realizar OMR en imágenes, solo necesita dos cosas: la plantilla OMR preparada (.omr) y las imágenes (formularios/hojas rellenadas por el usuario) para realizar OMR. La API es compatible con OMR para los siguientes formatos de imagen:

Los siguientes son los pasos para realizar OMR en imágenes:

El siguiente ejemplo de código muestra cómo reconocer marcas ópticas en imágenes usando Java.

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

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

// inicialice el motor y obtenga el procesador de plantilla que proporciona la ruta al archivo .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// bucle de imágenes
for (int i = 0; i < UserImages.length; i++) {
    // ruta a la imagen a reconocer
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // reconocer imagen y recibir resultado
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

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

    String json = result.getJson();

    // guardar csv en la carpeta de salida
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Uso de un umbral de reconocimiento personalizado para OMR

También puede ajustar los resultados de OMR definiendo un umbral personalizado entre 0 y 100. Aumentar el umbral hace que la API sea más estricta a la hora de reconocer las respuestas. Los valores de umbral se pueden establecer en el método TemplateProcessor.recognizeImage() como segundo parámetro, como se muestra en el siguiente ejemplo de código 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;

// inicialice el motor y obtenga el procesador de plantilla que proporciona la ruta al archivo .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// bucle de imágenes
for (int i = 0; i < UserImages.length; i++) {
    // ruta a la imagen a reconocer
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // reconocer imagen y recibir resultado
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

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

    String json = result.getJson();

    // guardar csv en la carpeta de salida
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Recalcular los resultados de OMR

En algunos casos, es posible que desee volver a calcular los resultados de OMR con diferentes valores de umbral. En lugar de llamar a TemplateProcessor.recognizeImage() una y otra vez en tales casos, puede configurar la API para el recálculo automático utilizando el método TemplateProcessor.recalculate() para mejorar la eficiencia del procesamiento de imágenes. El siguiente ejemplo de código muestra cómo implementar el recálculo de los resultados de OMR.

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

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

// motor de inicio y obtener el procesador de plantilla
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// Establezca un umbral personalizado para usar en el recálculo
// este valor está en el rango (0 a 100)
// representa el porcentaje de píxeles negros necesarios en la imagen de la burbuja para que se reconozca
// es decir, cuanto menor sea el valor, menos píxeles negros se requieren para que la burbuja se cuente como llena y viceversa
int CustomThreshold = 40;

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

    // reconocer imagen
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // obtener cadena csv de exportación
    String stringRes = result.getCsv();

    // guardar csv en la carpeta de salida
    String outputName = UserImagesNoExt[i] + ".csv";

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

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

    // recalcular los resultados del reconocimiento con un umbral personalizado
    templateProcessor.recalculate(result, CustomThreshold);

    // obtener cadena csv de exportación
    stringRes = result.getCsv();

    // guardar 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();
}

En caso de que tenga alguna pregunta o consulta relacionada con nuestra biblioteca Java OMR, contáctenos a través de nuestro foro para cualquier pregunta o consulta.

Ver también