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:
- Skapa ett OmrEngine-objekt.
- Anropa metoden OmrEngine.generateTemplate() som accepterar markuptextfilens sökväg.
- Spara mallen med metoden GenerationResult.save.
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
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:
- Skapa OmrEngine objekt.
- Skapa TemplateProcessor-objekt och initiera det med OMR-mallens sökväg.
- Känn igen bilder med metoden TemplateProcessor.recognizeImage() och få resultat i CSV- eller JSON-format.
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.