c# - 使用多线程与 C# 进行 OCR

标签 c# multithreading ocr

我需要有关 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

但是我没有得到任何结果..

那么在我的案例中是否可以实现多线程?我必须使用哪种方法?

  • 任务工厂
  • 后台 worker
  • 线程
  • 还是别的?

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

编辑:

好像是

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

执行得更快
string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});

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

编辑 2:

好的,任务没有任何区别。没有它们我得到了相同的速度测试结果。

最佳答案

您正确地开始了任务,但您永远不会等待它们完成。你想做的是类似于;

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];

可以找到更多示例代码here .

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

关于c# - 使用多线程与 C# 进行 OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859619/

相关文章:

C# - 使用 HTMLAgilityPack 获取 JavaScript 变量值

c# - 如何解决多个库中存在的 HttpClient

python - 剪贴板内容改变时触发事件

java - 使用 java 时,文本识别 (OCR) 在 Sikuli 中被关闭

c# - 将 SolidColorBrush 绑定(bind)到 ControlTemplate 背景

c# - 按扩展名的内容类型

java:如何停止等待很长时间的线程

c# - 停止在线程中播放音乐

python - 使用 opencv 为 python 中的 OCR 准备适当的图像阈值

security - reCaptcha 是否已被破解/黑客攻击/OCR 识别/击败/损坏?