Nhận dạng dấu quang học (OMR) là một quy trình điện tử cho phép đọc và ghi lại dữ liệu được đánh dấu bởi những người trên một loại biểu mẫu tài liệu đặc biệt. Biểu mẫu tài liệu này có thể là một bài kiểm tra hoặc một cuộc khảo sát, bao gồm các đầu vào bong bóng hoặc hình vuông do người dùng điền. Chúng tôi có thể dễ dàng thực hiện các thao tác OMR trên hình ảnh quét của các biểu mẫu khảo sát, bảng câu hỏi hoặc phiếu kiểm tra đó và đọc đầu vào của người dùng theo chương trình. Trong bài này, chúng ta sẽ học cách thực hiện OMR và trích xuất dữ liệu từ một hình ảnh trong Java.
Các chủ đề sau sẽ được đề cập trong bài viết này:
- Java OMR API để trích xuất dữ liệu từ hình ảnh
- Trích xuất dữ liệu từ một hình ảnh
- Thực hiện OMR và trích xuất dữ liệu từ nhiều hình ảnh
- Trích xuất dữ liệu OMR với ngưỡng
- Trích xuất dữ liệu OMR với tính toán lại
API Java OMR để trích xuất dữ liệu từ hình ảnh
Để thực hiện các hoạt động OMR và trích xuất dữ liệu từ các định dạng hình ảnh được hỗ trợ, chúng tôi sẽ sử dụng Aspose.OMR for Java API. Nó cho phép thiết kế, tạo và nhận dạng phiếu trả lời, bài kiểm tra, bài MCQ, câu đố, biểu mẫu phản hồi, khảo sát và phiếu bầu.
Lớp OmrEngine của API xử lý việc tạo mẫu và xử lý hình ảnh. Phương thức getTemplateProcessor (String templatePath) của lớp này tạo thể hiện TemplateProcessor để xử lý các mẫu và hình ảnh. Chúng ta có thể nhận ra một hình ảnh bằng phương thức Recognimage (String imagePath). Nó trả về tất cả các phần tử OMR dưới dạng một cá thể lớp RecognitionResult. Phương thức getCsv() của lớp này tạo ra một chuỗi CSV với các kết quả nhận dạng. Phương thức tính toán lại (kết quả RecognitionResult, int Recognition) cập nhật kết quả nhận dạng bằng cách sử dụng các tham số đã được tinh chỉnh.
Vui lòng tải xuống JAR của API hoặc thêm cấu hình pom.xml sau vào ứng dụng Java dựa trên Maven.
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>http://repository.aspose.com/repo/</url>
</repository>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-omr</artifactId>
<version>19.12</version>
</dependency>
Trích xuất dữ liệu từ một hình ảnh trong Java
Chúng tôi cần mẫu OMR đã chuẩn bị (.omr) cùng với hình ảnh của các biểu mẫu / trang tính do người dùng điền để thực hiện thao tác OMR. Chúng tôi có thể thực hiện thao tác OMR trên hình ảnh và trích xuất dữ liệu bằng cách làm theo các bước dưới đây:
- Đầu tiên, tạo một thể hiện của lớp OmrEngine.
- Tiếp theo, gọi phương thức getTemplateProcessor() và khởi tạo đối tượng lớp TemplateProcessor. Nó lấy đường dẫn tệp mẫu OMR làm đối số.
- Sau đó, lấy đối tượng RecognitionResult bằng cách gọi phương thức RecognitionImage() với đường dẫn hình ảnh làm đối số.
- Sau đó, nhận kết quả nhận dạng dưới dạng chuỗi CSV bằng phương thức getCsv().
- Cuối cùng, lưu kết quả CSV dưới dạng tệp CSV trên đĩa cục bộ.
Mẫu mã sau đây cho thấy cách trích xuất dữ liệu OMR từ một hình ảnh ở định dạng CSV bằng cách sử dụng Java.
// Ví dụ mã này trình bày cách thực hiện OMR trên một hình ảnh và trích xuất dữ liệu
// Đường dẫn tệp mẫu OMR
String templatePath = "C:\\Files\\OMR\\Sheet.omr";
// Đường dẫn tệp hình ảnh
String imagePath = "C:\\Files\\OMR\\Sheet1.png";
// Khởi tạo công cụ OMR
OmrEngine engine = new OmrEngine();
// Nhận bộ xử lý mẫu
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
// Nhận dạng hình ảnh
RecognitionResult result = templateProcessor.recognizeImage(imagePath);
// Nhận kết quả trong CSV
String csvResult = result.getCsv();
// Lưu tệp CSV
PrintWriter wr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1.csv"), true);
wr.println(csvResult);
Vui lòng tải xuống mẫu OMR được sử dụng trong bài đăng blog này.
Thực hiện OMR và trích xuất dữ liệu từ nhiều hình ảnh
Chúng tôi có thể thực hiện các thao tác OMR trên nhiều hình ảnh và trích xuất dữ liệu trong một tệp CSV riêng biệt cho từng hình ảnh bằng cách làm theo các bước đã đề cập trước đó. Tuy nhiên, chúng ta cần lặp lại các bước # 3, 4 và 5 cho tất cả các hình ảnh một.
Mẫu mã sau đây cho thấy cách trích xuất dữ liệu OMR từ nhiều hình ảnh bằng Java.
// Ví dụ mã này trình bày cách thực hiện OMR trên nhiều hình ảnh và trích xuất dữ liệu
// Đường dẫn thư mục làm việc
String folderPath = "C:\\Files\\OMR\\";
// Đường dẫn tệp mẫu OMR
String templatePath = folderPath + "Sheet.omr";
// Đường dẫn tệp hình ảnh
String[] UserImages = new String[] { "Sheet1.png", "Sheet2.png" };
// Khởi tạo công cụ OMR
OmrEngine engine = new OmrEngine();
// Nhận bộ xử lý mẫu
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
// Xử lý từng hình ảnh một trong một vòng lặp
for (int i = 0; i < UserImages.length; i++)
{
String image = UserImages[i];
String imagePath = folderPath + image;
// Nhận dạng hình ảnh
RecognitionResult result = templateProcessor.recognizeImage(imagePath);
// Nhận kết quả trong CSV
String csvResult = result.getCsv();
// Lưu tệp CSV
PrintWriter wr = new PrintWriter(new FileOutputStream(folderPath + "Sheet_" + i + ".csv"), true);
wr.println(csvResult);
System.out.println(csvResult);
}
Trích xuất dữ liệu OMR với ngưỡng trong Java
Chúng tôi có thể thực hiện các hoạt động OMR với giá trị ngưỡng (0 đến 100) tùy thuộc vào yêu cầu. Giá trị của ngưỡng càng cao thì API càng chặt chẽ hơn trong việc làm nổi bật các câu trả lời. Vui lòng làm theo các bước đã đề cập trước đó để thực hiện OMR với ngưỡng. Tuy nhiên, chúng ta chỉ cần gọi phương thức nhận dạng quá tải (string, int32) ở bước # 3. Nó lấy đường dẫn tệp hình ảnh và giá trị ngưỡng làm đối số.
Mẫu mã sau đây cho thấy cách thực hiện OMR với giá trị ngưỡng bằng Java.
// Ví dụ mã này trình bày cách thực hiện OMR với giữ lại và trích xuất dữ liệu từ một hình ảnh
// Đường dẫn tệp mẫu OMR
String templatePath = "C:\\Files\\OMR\\Sheet.omr";
// Đường dẫn tệp hình ảnh
String imagePath = "C:\\Files\\OMR\\Sheet1.png";
// Giá trị ngưỡng
int CustomThreshold = 40;
// Khởi tạo công cụ OMR
OmrEngine engine = new OmrEngine();
// Nhận bộ xử lý mẫu
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
// Nhận dạng hình ảnh
RecognitionResult result = templateProcessor.recognizeImage(imagePath, CustomThreshold);
// Nhận kết quả trong CSV
String csvResult = result.getCsv();
// Lưu tệp CSV
PrintWriter wr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1_threshold.csv"), true);
wr.println(csvResult);
System.out.println(csvResult);
Trích xuất dữ liệu OMR với tính toán lại trong Java
Trong một số trường hợp nhất định, chúng tôi có thể cần tính toán lại kết quả OMR với các giá trị ngưỡng khác nhau. Với mục đích này, chúng ta có thể định cấu hình API để tự động tính toán lại bằng phương thức TemplateProcessor.recalculate(). Nó cho phép xử lý một hình ảnh nhiều lần bằng cách thay đổi cài đặt ngưỡng để có được kết quả mong muốn. Chúng tôi có thể thực hiện thao tác OMR với tính toán lại bằng cách thực hiện theo các bước dưới đây:
- Đầu tiên, tạo một thể hiện của lớp OmrEngine.
- Tiếp theo, gọi phương thức getTemplateProcessor() và khởi tạo đối tượng lớp TemplateProcessor. Nó lấy đường dẫn tệp mẫu OMR làm đối số.
- Sau đó, lấy đối tượng RecognitionResult bằng cách gọi phương thức RecognitionImage() với đường dẫn hình ảnh làm đối số.
- Tiếp theo, xuất kết quả nhận dạng dưới dạng chuỗi CSV bằng phương thức getCsv().
- Sau đó, lưu kết quả CSV dưới dạng tệp CSV trên đĩa cục bộ.
- Tiếp theo, gọi phương thức recalculate(). Nó lấy đối tượng RecognitionResult và giá trị ngưỡng làm đối số.
- Sau đó, xuất kết quả nhận dạng dưới dạng chuỗi CSV bằng phương thức getCsv().
- Cuối cùng, lưu kết quả CSV dưới dạng tệp CSV trên đĩa cục bộ.
Mẫu mã sau đây cho thấy cách thực hiện OMR với phương pháp tính toán lại sử dụng Java.
// Đường dẫn tệp mẫu OMR
String templatePath = "C:\\Files\\OMR\\Sheet.omr";
// Đường dẫn tệp hình ảnh
String imagePath = "C:\\Files\\OMR\\Sheet1.png";
// Giá trị ngưỡng
int CustomThreshold = 40;
// Khởi tạo công cụ OMR
OmrEngine engine = new OmrEngine();
// Nhận bộ xử lý mẫu
TemplateProcessor templateProcessor = engine.getTemplateProcessor(templatePath);
// Nhận dạng hình ảnh
RecognitionResult result = templateProcessor.recognizeImage(imagePath, CustomThreshold);
// Nhận kết quả trong CSV
String csvResult = result.getCsv();
// Lưu tệp CSV
PrintWriter wr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1.csv"), true);
wr.println(csvResult);
// Tính toán lại
// Bạn có thể áp dụng giá trị ngưỡng mới tại đây
templateProcessor.recalculate(result, CustomThreshold);
// Nhận kết quả được tính toán lại trong CSV
csvResult = result.getCsv();
// Lưu tệp CSV kết quả được tính toán lại
PrintWriter finalWr = new PrintWriter(new FileOutputStream("C:\\Files\\OMR\\Sheet1_recalculated.csv"), true);
finalWr.println(csvResult);
Nhận giấy phép miễn phí
Bạn có thể nhận giấy phép tạm thời miễn phí để dùng thử thư viện mà không có giới hạn đánh giá.
Sự kết luận
Trong bài viết này, chúng tôi đã học cách:
- thực hiện thao tác OMR trên hình ảnh;
- trích xuất dữ liệu ở định dạng CSV theo chương trình;
- áp dụng cài đặt ngưỡng trong khi thực hiện OMR trên hình ảnh;
- tính toán lại kết quả OMR trong một quy trình ô tô sử dụng Java.
Bên cạnh đó, trích xuất dữ liệu từ một hình ảnh trong Java, bạn có thể tìm hiểu thêm về Aspose.OMR for Java API bằng cách sử dụng tài liệu. Trong trường hợp có bất kỳ sự mơ hồ nào, vui lòng liên hệ với chúng tôi trên diễn đàn hỗ trợ miễn phí của chúng tôi.