光学标记识别 (OMR) 允许读取和捕获标记在特殊类型文档表单上的数据。该文档表单可以是测试或调查,由用户填写的气泡或方形输入组成。我们可以轻松地对此类调查表或测试表的扫描图像执行 OMR 操作,并在 .NET 应用程序中以编程方式读取用户输入。在本文中,我们将学习如何使用 C# 执行 OMR 和提取数据。
本文将涵盖以下主题:
用于执行 OMR 和提取数据的 C# OMR API
为了执行 OMR 操作和从图像中导出数据,我们将使用 Aspose.OMR for .NET API。它允许设计、创建和识别答题纸、测试、MCQ 试卷、测验、反馈表、调查和选票。请下载 API 的 DLL 或使用 NuGet 安装它。
PM> Install-Package Aspose.OMR
执行 OMR 并从图像中提取数据
为了对图像执行 OMR 操作,我们需要准备好的 OMR 模板 (.omr) 和图像(用户填写的表格/表格)来执行 OMR。我们可以按照以下步骤对图像执行 OMR 操作并提取数据:
- 首先,创建一个 OmrEngine 类的实例。
- 接下来,调用 GetTemplateProcessor() 方法并初始化 TemplateProcessor 类对象。它将 OMR 模板文件路径作为参数。
- 然后,通过调用 RecognizeImage() 方法以图像路径作为参数来获取 RecognitionResult 对象。
- 之后,使用 GetCsv() 方法将识别结果作为 CSV 字符串获取。
- 最后,将 CSV 结果保存为本地磁盘上的 CSV 文件。
以下代码示例展示了如何使用 C# 对图像执行 OMR 并以 CSV 格式提取数据。
// OMR 模板文件路径
string templatePath = @"D:\Files\OMR\Sheet.omr";
// 图片文件路径
string imagePath = @"D:\Files\OMR\Sheet1.jpg";
// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();
// 获取模板处理器
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// 识别图像
RecognitionResult result = templateProcessor.RecognizeImage(imagePath);
// 以 CSV 格式获取结果
string csvResult = result.GetCsv();
// 保存 CSV 文件
File.WriteAllText(@"D:\Files\OMR\Sheet1.csv", csvResult);
上述代码示例中使用的 OMR 模板可以从 这里 下载。
执行 OMR 并从多个图像中提取数据
我们可以对多个图像执行 OMR 操作,并按照前面提到的步骤将数据提取到每个图像的单独 CSV 文件中。但是,我们需要对所有图像一张一张地重复步骤 #3、4 和 5。
以下代码示例展示了如何使用 C# 对多个图像执行 OMR 并以 CSV 格式提取数据。
// OMR 模板文件路径
string templatePath = @"D:\Files\OMR\Sheet.omr";
// 图片文件夹文件路径
string imageFolderPath = @"D:\Files\OMR\";
// 输出目录路径
string outputPath = @"D:\Files\OMR\";
// 待处理图像
string[] UserImages = new string[] { "Sheet1.jpg", "Sheet2.jpg" };
// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();
// 获取模板处理器
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// 一张一张地处理图像
for (int i = 0; i < UserImages.Length; i++)
{
string imagePath = Path.Combine(imageFolderPath, UserImages[i]);
// 识别图像
RecognitionResult result = templateProcessor.RecognizeImage(imagePath);
// 以 CSV 格式获取结果
string csvResult = result.GetCsv();
// 保存 CSV 文件
File.WriteAllText(Path.Combine(outputPath, Path.GetFileNameWithoutExtension(UserImages[i]) + ".csv"), csvResult);
}
该 API 还提供了在 OMR 操作期间检测和识别图像上可用的任何条形码的功能。这是 OMR 操作的默认功能。我们可以按照前面提到的步骤进行 OMR 操作并识别条形码。
获取带阈值的 OMR 结果
我们可以在对图像执行 OMR 操作时应用阈值。根据需要,阈值的值可以从 0 到 100。阈值越高,API 对突出显示答案就越严格。请按照前面提到的步骤使用阈值执行 OMR。但是,我们只需要在第 3 步中调用重载的 RecognizeImage(string, int32) 方法。它将图像文件路径和阈值作为参数。
以下代码示例显示了如何使用 C# 执行具有阈值的 OMR。
// OMR 模板文件路径
string templatePath = @"D:\Files\OMR\Sheet.omr";
// 图片文件路径
string imagePath = @"D:\Files\OMR\Sheet1.jpg";
// 阈值
int CustomThreshold = 40;
// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();
// 获取模板处理器
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// 识别图像
RecognitionResult result = templateProcessor.RecognizeImage(imagePath, CustomThreshold);
// 以 CSV 格式获取结果
string csvResult = result.GetCsv();
// 保存 CSV 文件
File.WriteAllText(@"D:\Files\OMR\Sheet1_threshold.csv", csvResult);
带重新计算的 OMR 操作
在某些情况下,我们可能需要使用不同的阈值重新计算 OMR 结果。为此,我们可以将 API 配置为使用 TemplateProcessor.recalculate() 方法自动重新计算。它允许通过更改阈值设置来多次处理图像以获得所需的结果。我们可以按照以下给出的步骤执行带有重新计算的 OMR 操作:
- 首先,创建一个 OmrEngine 类的实例。
- 接下来调用GetTemplateProcessor()方法,初始化TemplateProcessor类对象。它将 OMR 模板文件路径作为参数。
- 然后,初始化 Stopwatch 对象并启动计时器。
- 接下来,通过以图像路径为参数调用 RecognizeImage() 方法来获取 RecognitionResult 对象。
- 然后,停止计时器并使用 GetCsv() 方法将识别结果导出为 CSV 字符串。
- 接下来,将 CSV 结果保存为本地磁盘上的 CSV 文件。
- 然后,使用 Restart() 方法重新启动计时器。
- 接下来,调用 Recalculate() 方法。它将 RecognitionResult 对象和阈值作为参数。
- 之后,停止计时器并使用 GetCsv() 方法将识别结果导出为 CSV 字符串。
- 最后,将 CSV 结果保存为本地磁盘上的 CSV 文件。
以下代码示例显示了如何使用 C# 使用重新计算方法执行 OMR。
// OMR 模板文件路径
string templatePath = @"D:\Files\OMR\Sheet.omr";
// 图片文件路径
string imagePath = @"D:\Files\OMR\Sheet1.jpg";
// 阈值
int CustomThreshold = 40;
// 初始化 OMR 引擎
OmrEngine engine = new OmrEngine();
// 获取模板处理器
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// 性能测量计时器
Stopwatch sw = Stopwatch.StartNew();
// 识别图像
RecognitionResult result = templateProcessor.RecognizeImage(imagePath, CustomThreshold);
sw.Stop();
// 以 CSV 格式获取结果
string csvResult = result.GetCsv();
// 保存 CSV 文件
File.WriteAllText(@"D:\Files\OMR\Sheet1.csv", csvResult);
sw.Restart();
// 重新计算
templateProcessor.重新计算(result, CustomThreshold);
sw.Stop();
// 以 CSV 格式获取重新计算的结果
csvResult = result.GetCsv();
// 保存重新计算的结果 CSV 文件
File.WriteAllText(@"D:\Files\OMR\Sheet1_重新计算d.csv", csvResult);
获得免费许可证
您可以 获得免费的临时许可证 试用该库而不受评估限制。
结论
在本文中,我们学习了如何:
- 使用 C# 对图像进行 OMR 操作并提取 CSV 格式的数据;
- 在对图像执行 OMR 时应用阈值设置;
- 以编程方式重新计算汽车流程中的 OMR 结果。
此外,您可以使用 documentation 了解更多关于 Aspose.OMR for .NET API 的信息。如有任何歧义,请随时在 论坛 上与我们联系。