Java OMR-bibliotek

Behöver du ett enkelt men funktionsrikt Java OMR-bibliotek? Vill du känna igen optiska märken i skannade bilder? Prova Aspose.OMR for Java - Ett Java-klassbibliotek för att utföra OMR-operationer (Optical Mark Recognition) i Java-baserade applikationer. Låt oss ta en snabb promenad genom funktionerna i nämnda Java API för att se hur man känner igen optiska märken i en mängd olika bildformat och fångar mänskligt märkta data från enkäter, frågeformulär eller tester som innehåller MCQ.

Skapa dynamiskt OMR-mall med Java OMR Library

Aspose.OMR för Java tillhandahåller en komplett uppsättning funktioner från att skapa OMR-mallen till att känna igen de optiska märkena för att fånga data. API:et stöder generering av OMR-mallfilen eller bilden från enkla textmarkeringar. Du kan helt enkelt skicka mallens textmarkering till API:t och det kommer att generera mallen åt dig. Följande är ett exempel på textmarkering för en OMR-mall.

?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________________________________

Du kan helt enkelt spara textuppmärkningen i en textfil med filtillägget .txt. När du är klar kan du skapa mallen med följande steg:

Följande kodexempel visar hur man genererar OMR-mallen från textuppmärkning med 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++)
{
    // generering av anropsmall ger sökväg till txt-filen med markering
    GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);

    // kontrollera vid fel
    if (res.getErrorCode() != 0)
    {
        System.out.println("ERROR CODE: " + res.getErrorCode());
    }

    // spara generationsresultat: bild och .omr-mall
    res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}

Produktion

Java OMR-bibliotek

Optical Mark Recognition (OMR) i bilder med Java

För att utföra OMR i bilder behöver du bara två saker - den förberedda OMR-mallen (.omr) och bilderna (användarfyllda formulär/ark) att utföra OMR på. API:et stöder OMR för följande bildformat:

Följande är stegen för att utföra OMR i bilder:

Följande kodexempel visar hur man känner igen optiska märken i bilder med Java.

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

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

// initiera motorn och hämta mallprocessor som ger sökvägen till .omr-filen
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// bilder loop
for (int i = 0; i < UserImages.length; i++) {
    // sökvägen till bilden som ska kännas igen
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // känna igen bild och ta emot resultat
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // exportera resultat som csv-sträng
    String csvResult = result.getCsv();

    String json = result.getJson();

    // spara csv till utdatamappen
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Använda en anpassad igenkänningströskel för OMR

Du kan också finjustera OMR-resultaten genom att definiera ett anpassat tröskelvärde mellan 0 och 100. Att öka tröskeln gör API:et mer strikt när det gäller att känna igen svaren. Tröskelvärdena kan ställas in i metoden TemplateProcessor.recognizeImage() som den andra parametern som visas i följande Java-kodexempel.

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

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

// initiera motorn och hämta mallprocessor som ger sökvägen till .omr-filen
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// bilder loop
for (int i = 0; i < UserImages.length; i++) {
    // sökvägen till bilden som ska kännas igen
    String imagePath = UserImages[i];
    System.out.println("Processing image: " + imagePath);

    // känna igen bild och ta emot resultat
    RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);

    // exportera resultat som csv-sträng
    String csvResult = result.getCsv();

    String json = result.getJson();

    // spara csv till utdatamappen
    PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
    wr.println(csvResult);
}

Omräkning av OMR-resultaten

I vissa fall kanske du vill räkna om OMR-resultaten med olika tröskelvärden. Istället för att anropa TemplateProcessor.recognizeImage() om och om igen i sådana fall, kan du konfigurera API:et för automatisk omräkning med metoden TemplateProcessor.recalculate() för att förbättra bildbehandlingseffektiviteten. Följande kodexempel visar hur man implementerar omräkningen av OMR-resultaten.

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

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

// starta motorn och skaffa mallprocessor
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");

// Ställ in anpassat tröskelvärde som ska användas vid omräkning
// detta värde ligger inom intervallet (0 till 100)
// representerar procentandelen av erforderliga svarta pixlar på bubbelbilden som ska kännas igen
// dvs ju lägre värde - desto färre svarta pixlar krävs för att bubblan ska räknas som fylld och vice versa
int CustomThreshold = 40;

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

    // känna igen bilden
    RecognitionResult result = templateProcessor.recognizeImage(imagePath);

    // hämta export csv-sträng
    String stringRes = result.getCsv();

    // spara csv till utdatamappen
    String outputName = UserImagesNoExt[i] + ".csv";

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

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

    // beräkna igenkänningsresultat med anpassad tröskel
    templateProcessor.recalculate(result, CustomThreshold);

    // hämta export csv-sträng
    stringRes = result.getCsv();

    // spara omräknade resultat
    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();
}

Om du skulle ha några frågor eller frågor relaterade till vårt Java OMR-bibliotek, kontakta oss via vårt forum för alla frågor eller funderingar.

Se även