Libreria Java OMR

Hai bisogno di una libreria OMR Java semplice ma ricca di funzionalità? Vuoi riconoscere i segni ottici nelle immagini scansionate? Prova Aspose.OMR per Java - Una libreria di classi Java per eseguire le operazioni di riconoscimento ottico dei segni (OMR) nelle applicazioni basate su Java. Diamo una rapida panoramica delle funzionalità della suddetta API Java per vedere come riconoscere i segni ottici in una varietà di formati di immagine e acquisire dati contrassegnati dall’uomo da sondaggi, questionari o test contenenti MCQ.

Crea dinamicamente un modello OMR utilizzando la libreria OMR Java

Aspose.OMR per Java fornisce un set completo di funzionalità dalla creazione del modello OMR al riconoscimento dei segni ottici per acquisire i dati. L’API supporta la generazione del file modello OMR o dell’immagine da semplici markup di testo. Puoi semplicemente passare il markup del testo del modello all’API e questo genererà il modello per te. Di seguito è riportato un esempio di markup di testo per un modello 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________________________________

Puoi semplicemente salvare il markup del testo in un file di testo con estensione .txt. Una volta terminato, puoi generare il modello utilizzando i seguenti passaggi:

L’esempio di codice seguente mostra come generare il modello OMR dal markup del testo utilizzando 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++)
{
    // generazione del modello di chiamata che fornisce il percorso del file txt con markup
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // controllare in caso di errori
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // salva il risultato della generazione: immagine e modello .omr
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

Produzione

Libreria Java OMR

Riconoscimento ottico del segno (OMR) nelle immagini utilizzando Java

Per eseguire l’OMR nelle immagini, hai solo bisogno di due cose: il modello OMR preparato (.omr) e le immagini (moduli/fogli compilati dall’utente) su cui eseguire l’OMR. L’API supporta l’OMR per i seguenti formati di immagine:

Di seguito sono riportati i passaggi per eseguire l’OMR nelle immagini:

L’esempio di codice seguente mostra come riconoscere i segni ottici nelle immagini utilizzando Java.

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

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

// inizializza il motore e ottieni il processore del modello che fornisce il percorso del file .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// ciclo di immagini
for (int i = 0; i < UserImages.length; i++) {
    // percorso verso l'immagine da riconoscere
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // riconoscere l'immagine e ricevere il risultato
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // esporta i risultati come stringa csv
    String csvResult = result.getCsv();

    String json = result.getJson();

    // salva csv nella cartella di output
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Utilizzo di una soglia di riconoscimento personalizzata per OMR

Puoi anche perfezionare i risultati OMR definendo una soglia personalizzata compresa tra 0 e 100. L’aumento della soglia rende l’API più rigorosa nel riconoscere le risposte. I valori di soglia possono essere impostati nel metodo TemplateProcessor.recognizeImage() come secondo parametro, come mostrato nell’esempio di codice Java seguente.

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

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

// inizializza il motore e ottieni il processore del modello che fornisce il percorso al file .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// ciclo di immagini
for (int i = 0; i < UserImages.length; i++) {
    // percorso verso l'immagine da riconoscere
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // riconoscere l'immagine e ricevere il risultato
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

    // esporta i risultati come stringa csv
    String csvResult = result.getCsv();

    String json = result.getJson();

    // salva csv nella cartella di output
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Ricalcolo dei risultati OMR

In alcuni casi, potresti voler ricalcolare i risultati OMR con diversi valori di soglia. Invece di chiamare TemplateProcessor.recognizeImage() ancora e ancora in questi casi, puoi configurare l’API per il ricalcolo automatico usando il metodo TemplateProcessor.recalculate() per migliorare l’efficienza dell’elaborazione delle immagini. Nell’esempio di codice seguente viene illustrato come implementare il ricalcolo dei risultati 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 ottieni template processor
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// Imposta la soglia personalizzata da utilizzare nel ricalcolo
// questo valore è compreso nell'intervallo (da 0 a 100)
// rappresenta la percentuale di pixel neri richiesti sull'immagine bolla da riconoscere
// cioè più basso è il valore, meno pixel neri sono necessari per conteggiare la bolla come riempita e viceversa
int CustomThreshold = 40;

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

    // riconoscere l'immagine
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // ottieni la stringa csv di esportazione
    String stringRes = result.getCsv();

    // salva csv nella cartella di output
    String outputName = UserImagesNoExt[i] + ".csv";

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

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

    // ricalcolare i risultati del riconoscimento con una soglia personalizzata
    templateProcessor.recalculate(result, CustomThreshold);

    // ottieni la stringa csv di esportazione
    stringRes = result.getCsv();

    // salvare i risultati ricalcolati
    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();
}

In caso di domande o domande relative alla nostra libreria Java OMR, contattaci tramite il nostro forum per qualsiasi domanda o domanda.

Guarda anche