使用 C# 执行 OMR 和提取数据

光学标记识别 (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 操作并提取数据:

  1. 首先,创建一个 OmrEngine 类的实例。
  2. 接下来,调用 GetTemplateProcessor() 方法并初始化 TemplateProcessor 类对象。它将 OMR 模板文件路径作为参数。
  3. 然后,通过调用 RecognizeImage() 方法以图像路径作为参数来获取 RecognitionResult 对象。
  4. 之后,使用 GetCsv() 方法将识别结果作为 CSV 字符串获取。
  5. 最后,将 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 模板可以从 这里 下载。

执行 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 操作:

  1. 首先,创建一个 OmrEngine 类的实例。
  2. 接下来调用GetTemplateProcessor()方法,初始化TemplateProcessor类对象。它将 OMR 模板文件路径作为参数。
  3. 然后,初始化 Stopwatch 对象并启动计时器。
  4. 接下来,通过以图像路径为参数调用 RecognizeImage() 方法来获取 RecognitionResult 对象。
  5. 然后,停止计时器并使用 GetCsv() 方法将识别结果导出为 CSV 字符串。
  6. 接下来,将 CSV 结果保存为本地磁盘上的 CSV 文件。
  7. 然后,使用 Restart() 方法重新启动计时器。
  8. 接下来,调用 Recalculate() 方法。它将 RecognitionResult 对象和阈值作为参数。
  9. 之后,停止计时器并使用 GetCsv() 方法将识别结果导出为 CSV 字符串。
  10. 最后,将 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 的信息。如有任何歧义,请随时在 论坛 上与我们联系。

也可以看看