Czy potrzebujesz prostej, ale bogatej w funkcje biblioteki Java OMR? Czy chcesz rozpoznawać znaki optyczne na zeskanowanych obrazach? Wypróbuj Aspose.OMR for Java — bibliotekę klas języka Java do wykonywania operacji optycznego rozpoznawania znaków (OMR) w aplikacjach opartych na języku Java. Zapoznajmy się szybko z funkcjami wspomnianego API Java, aby zobaczyć, jak rozpoznawać znaki optyczne w różnych formatach obrazów i przechwytywać dane oznaczone przez człowieka z ankiet, kwestionariuszy lub testów zawierających MCQ.
Dynamicznie twórz szablon OMR przy użyciu biblioteki Java OMR
Aspose.OMR for Java zapewnia pełny zestaw funkcji, od tworzenia szablonu OMR po rozpoznawanie znaków optycznych w celu przechwytywania danych. Interfejs API obsługuje generowanie pliku szablonu OMR lub obrazu z prostych znaczników tekstowych. Możesz po prostu przekazać znaczniki tekstowe szablonu do interfejsu API, który wygeneruje dla Ciebie szablon. Poniżej znajduje się przykładowy znacznik tekstowy dla szablonu 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________________________________
Możesz po prostu zapisać znaczniki tekstowe w pliku tekstowym z rozszerzeniem .txt. Po zakończeniu możesz wygenerować szablon, wykonując następujące czynności:
- Utwórz obiekt OmrEngine.
- Wywołaj metodę OmrEngine.generateTemplate(), która akceptuje ścieżkę do pliku tekstowego znaczników.
- Zapisz szablon metodą GenerationResult.save.
Poniższy przykładowy kod pokazuje, jak wygenerować szablon OMR ze znaczników tekstowych przy użyciu języka 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++)
{
// generowanie szablonu wywołania z podaniem ścieżki do pliku txt ze znacznikami
GenerationResult res = engine.generateTemplate(GenerationMarkups[i]);
// sprawdzić w przypadku błędów
if (res.getErrorCode() != 0)
{
System.out.println("ERROR CODE: " + res.getErrorCode());
}
// zapisz wynik generowania: obraz i szablon .omr
res.save(outputDirectory, GenerationMarkupsNoExt[i]);
}
Wyjście
Optical Mark Recognition (OMR) w obrazach przy użyciu języka Java
Aby wykonać OMR w obrazach, potrzebujesz tylko dwóch rzeczy - przygotowanego szablonu OMR (.omr) oraz obrazów (formularzy/arkuszy wypełnionych przez użytkownika), na których można wykonać OMR. Interfejs API obsługuje OMR dla następujących formatów obrazów:
Poniżej przedstawiono kroki, aby wykonać OMR na obrazach:
- Utwórz obiekt OmrEngine.
- Utwórz obiekt TemplateProcessor i zainicjuj go ścieżką szablonu OMR.
- Rozpoznawaj obrazy za pomocą metody TemplateProcessor.recognizeImage() i otrzymuj wyniki w formacie CSV lub JSON.
Poniższy przykładowy kod pokazuje, jak rozpoznawać znaki optyczne na obrazach przy użyciu języka Java.
String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };
String outputDirectory = "Result";
String templatePath = "Sheet.omr";
// zainicjuj silnik i pobierz procesor szablonów podając ścieżkę do pliku .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");
// pętla obrazów
for (int i = 0; i < UserImages.length; i++) {
// ścieżkę do obrazu, który ma zostać rozpoznany
String imagePath = UserImages[i];
System.out.println("Processing image: " + imagePath);
// rozpoznać obraz i otrzymać wynik
RecognitionResult result = templateProcessor.recognizeImage(imagePath);
// wyeksportuj wyniki jako ciąg znaków csv
String csvResult = result.getCsv();
String json = result.getJson();
// zapisz csv w folderze wyjściowym
PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
wr.println(csvResult);
}
Używanie niestandardowego progu rozpoznawania dla OMR
Możesz także dostosować wyniki OMR, definiując niestandardowy próg z zakresu od 0 do 100. Zwiększenie progu powoduje, że interfejs API jest bardziej rygorystyczny w rozpoznawaniu odpowiedzi. Wartości progowe można ustawić w metodzie TemplateProcessor.recognizeImage() jako drugi parametr, jak pokazano w poniższym przykładzie kodu 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;
// zainicjuj silnik i pobierz procesor szablonów podając ścieżkę do pliku .omr
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");
// pętla obrazów
for (int i = 0; i < UserImages.length; i++) {
// ścieżkę do obrazu, który ma zostać rozpoznany
String imagePath = UserImages[i];
System.out.println("Processing image: " + imagePath);
// rozpoznać obraz i otrzymać wynik
RecognitionResult result = templateProcessor.recognizeImage(imagePath, customThreshold);
// wyeksportuj wyniki jako ciąg znaków csv
String csvResult = result.getCsv();
String json = result.getJson();
// zapisz csv w folderze wyjściowym
PrintWriter wr = new PrintWriter(new FileOutputStream(UserImagesNoExt[i] + ".csv"), true);
wr.println(csvResult);
}
Ponowne obliczanie wyników OMR
W niektórych przypadkach może być konieczne ponowne obliczenie wyników OMR z innymi wartościami progowymi. Zamiast wielokrotnie wywoływać TemplateProcessor.recognizeImage() w takich przypadkach, możesz skonfigurować API do automatycznego ponownego obliczania za pomocą metody TemplateProcessor.recalculate(), aby poprawić wydajność przetwarzania obrazu. Poniższy przykładowy kod pokazuje, jak zaimplementować ponowne obliczenie wyników OMR.
String[] UserImages = new String[] { "Sheet1.jpg", "Sheet2.jpg" };
String[] UserImagesNoExt = new String[] { "Sheet1", "Sheet2" };
String outputDirectory = "Result";
String templatePath = "Sheet.omr";
// init engine i pobierz procesor szablonów
OmrEngine engine = new OmrEngine();
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
System.out.println("Template loaded.");
// Ustaw próg niestandardowy do użycia w ponownym obliczeniu
// ta wartość mieści się w zakresie (0 do 100)
// reprezentuje procent wymaganych czarnych pikseli na obrazie bąbelkowym do rozpoznania
// tzn. im niższa wartość - tym mniej czarnych pikseli potrzeba, aby bąbelek został uznany za wypełniony i odwrotnie
int CustomThreshold = 40;
// pętla obrazów
for (int i = 0; i < UserImages.length; i++)
{
String image = UserImages[i];
String imagePath = image;
System.out.println("Processing image: " + imagePath);
// rozpoznać obraz
RecognitionResult result = templateProcessor.recognizeImage(imagePath);
// pobierz ciąg eksportu csv
String stringRes = result.getCsv();
// zapisz csv w folderze wyjściowym
String outputName = UserImagesNoExt[i] + ".csv";
PrintWriter wr = new PrintWriter(new FileOutputStream(outputName), true);
wr.println(stringRes);
System.out.println("Export done. Path: " + outputName);
// przelicz wyniki rozpoznawania z niestandardowym progiem
templateProcessor.recalculate(result, CustomThreshold);
// pobierz ciąg eksportu csv
stringRes = result.getCsv();
// zapisać przeliczone wyniki
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();
}
Jeśli masz jakiekolwiek pytania lub wątpliwości związane z naszą biblioteką Java OMR, skontaktuj się z nami za pośrednictwem naszego forum, aby uzyskać wszelkie pytania lub zapytania.