使用C#进行OCR

本文关键字:OCR 进行 使用 | 更新日期: 2023-09-27 18:29:01

我需要关于WinForms C#应用程序中多线程实现的建议。我们有一个图像-带有文本数字,并且有单独的方法来OCR不同类型的数据。例如:

decimal[] numbers = getNumbers(bitmap, dictionary1);
string[] text = getText(bitmap, dictionary2);
int[] integers = getInts(bitmap, dictionary3);
// add 5 more data types (list, int[], etc..)

因此,整个过程大约需要1秒

我在考虑同时在不同的线程上运行OCR。出于这个原因,我尝试使用任务工厂:

decimal[] numbers;
Task.Factory.StartNew(() =>
{numbers = getNumbers(bitmap, dictionary1);});
string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});
textBox1.Text = "" + text[0]; // nothing

但我没有得到任何结果。。

那么在我的情况下,有可能实现多线程吗我必须使用哪种方法?

  • 任务工厂
  • 背景工作者
  • 螺纹
  • 还是别的什么

如果可能的话,你能给我一个关于如何使用你的方法的小建议吗?因为TaskFactory在我尝试使用它时失败了(例如)。

编辑:

看起来像

textBox1.Text = "" + text[0];

执行速度快于

string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});

这就是TextBox字段为空的原因。。所以我在代码的最后移动了"textBox1.Text="+Text[0];",最后得到了结果。。

编辑2:

好的,任务没有任何区别。。没有他们,我的速度测试结果也一样。

使用C#进行OCR

您正确地启动了任务,但从不等待它们完成。你想做的事情类似于;

Task[] tasks = new Task[2];
decimal[] numbers;
tasks[0] = Task.Factory.StartNew(() =>
   {numbers = getNumbers(bitmap, dictionary1);});
string[] text;
tasks[1] = Task.Factory.StartNew(() =>
   {text = getText(bitmap, dictionary2);});
Task.WaitAll(tasks);  // Wait for all parallel tasks to finish 
                      // before using their output.
textBox1.Text = "" + text[0];

更多示例代码可以在这里找到。

或者,您可以从任务中返回值,而不是将其分配给变量,然后使用task.Result,当您访问它时,它将等待任务完成并返回任务的结果。