Biblioteka Java OMR

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:

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

Biblioteka Java OMR

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:

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.

Zobacz też