如何在 ASP.Net MVC4 Web API 项目中使用 Microsoft OCR 库 ( Microsoft.Windows.Ocr )?

Posted

技术标签:

【中文标题】如何在 ASP.Net MVC4 Web API 项目中使用 Microsoft OCR 库 ( Microsoft.Windows.Ocr )?【英文标题】:How to use Microsoft OCR Library ( Microsoft.Windows.Ocr ) in an ASP.Net MVC4 Web API Project? 【发布时间】:2015-01-27 16:52:33 【问题描述】:

TL;DR:

有谁知道在像 MV4 Web API 这样的服务器端 ASP.Net Web 应用程序上引用 Microsoft.Windows.Ocr (/WindowsPreview.Media.Ocr.dll) 程序集的方法,并利用该程序集中的 OCR 功能来获取照片图像作为输入并从中提取文本内容? 如果是,请在您的回答中提供详细说明。

问题详情(以及我目前尝试过的方法)

我正在构建一个 Web 应用程序,该应用程序将图像上传到服务器(通过文件上传 UI 屏幕),然后使用 OCR 读取文本并在下一页上显示文本,就在下一个到上传的图片。

由于大多数商业 OCR 库的成本都很高 (over $1,300 last time I checked),我想我可以尝试使用 Microsoft OCR 库 Microsoft.Windows.Ocr,它是免费和似乎是 very simple 并且易于使用。

所以我尝试将 Microsoft.Windows.Ocr Nuget 包安装到我的 ASP.Net MVC4 Web API 项目中,并且成功了。

之后,我查看了我的 MVC4 Web API 项目引用,令我惊讶的是,没有找到对 Microsoft.Windows.Ocr.dll 程序集的引用。

然后我尝试通过浏览到 \packages 文件夹中的该程序集来添加对 Microsoft.Windows.Ocr.dll 程序集的 x86 版本的引用,并选择 WindowsPreview.Media.Ocr.dll 来自\lib\win81\x86文件夹

注意:程序集名称是 WindowsPreview.Media.Ocr.dll 而不是 Microsoft.Windows.Ocr.dll ,不知道为什么!

当我这样做并单击确定时,我收到以下错误消息

---------------------------
Microsoft Visual Studio
---------------------------
A reference to   
'D:\TestProjects\packages\Microsoft.Windows.Ocr.1.0.0\lib\win81\x86\
 WindowsPreview.Media.Ocr.dll' could not be added. Please make sure 
 that the file is accessible, and that it is a valid assembly 
 or COM component.
---------------------------
OK   
---------------------------

然后我从the Nuget Page 发现“支持的平台”只有 Windows Phone 8、Windows Phone 8.1、Windows 8.1(仅限 Windows 应用商店应用程序)。

但肯定有办法在 ASP.Net 应用程序的服务器端使用此 OCR dll

有谁知道在服务器端 ASP.Net Web 应用程序(如 MV4 Web API)上引用 Microsoft.Windows.Ocr (/WindowsPreview.Media.Ocr.dll) 程序集并利用该程序集中的 OCR 功能拍摄照片图像的方法作为输入并从中提取文本内容?** 如果是,请在您的回答中提供详细说明。

任何“黑客”和/或示例代码将不胜感激!

谢谢!!

【问题讨论】:

那么是 ASP.NET MVC 4 还是 ASP.NET Web API? .dll 不是服务器库。它是 Windows Phone 和 Windows 8.1 应用商店客户端应用程序独有的。 @abatishchev 是的! AndrewCounts 我明白。但这不可能吗?我尝试了各种开源和商业 OCR 库。开源的有缺陷并且没有更新,而商业的成本超过 1000 美元 + 荒谬的版税。 我在同一条船上。我正在寻找 OCR,我确实在我即将尝试的代码项目上找到了一些东西。 codeproject.com/Articles/10130/OCR-with-Microsoft-Office 嗨 Shiva,仅供参考 Asprise OCR for C#, VB.NET SDK Component Library 是免版税的。 【参考方案1】:

如果您使用的是 Visual Studio 2015 和 Windows 10,则

Microsoft.Windows.Ocr

已移至通用 Windows 平台。它可以作为

Windows.Media.Ocr

因此,您需要升级您的 VS 2015 并启用 Windows 10 工具。

我执行了以下操作,并将 Windows.Media.Ocr 作为参考添加到我的 Web API 中。

    在您的 Web API 项目的引用中,右键单击任何引用,然后单击在对象浏览器中查看。您的对象浏览器将如下所示 “浏览:所有组件”框旁边有一个“...”按钮。工具提示显示“编辑自定义组件集”。单击! 在“编辑自定义组件集”框中单击浏览选项卡并导航到“C:/Program Files(x86)/Windows Kits/10/References/Windows.Foundation.UniversalApiContract/1.0.0.0” 并单击生成的 winmd 文件,然后单击添加。 点击确定! 现在单击“在解决方案资源管理器中添加到选定项目中的引用”图标(它是“浏览:”旁边的“...”按钮的第三个按钮)。您可以看到 Windows.Media.Ocr 可供使用。

注意:以下内容仅适用于 VS 2015 和 Windows 10。VS 2015 也应针对Universal Windows Platform(UWP) 进行更新。检查 this 以获取示例 OCR。

希望这会有所帮助。 更新 它已导入我的参考,但无法加载。希望它为人们提供一些开始。 谢谢!。

【讨论】:

谢谢@Anish 我会尽快检查并告诉你。 你有关于如何“升级你的 VS 2015 并启用 Windows 10 工具”的说明吗?我正在查看 NuGet 包,但不确定是哪一个。 @Ewan - 你可以去控制面板 -> 选择 V​​S2015 -> 点击更改 -> 点击修改 -> 选择通用 Windows 平台 - 点击下一步/完成。它将更新您的 VS2015 for win dev。【参考方案2】:

您可以跳到下面的更新 2 以获得有效的解决方案。

它会抛出一个类型负载异常。话虽这么说,我发帖是因为我正在尝试做同样的事情,但无法让项目运行。以下是有关如何将 winrt api 导入非 Windows 应用项目的一些基本说明。

http://weblogs.thinktecture.com/cnagel/2012/10/calling-winrt-from-windows-desktop-apps.html

也不要尝试引用 dll,而是引用 winmd 文件。

这是一个引用 ocr 库的示例控制台应用程序,但是当您运行该解决方案时,它会引发类型加载异常。(https://github.com/Xandroid4Net/MicrsoftOcrConsoleApp) 它应该很容易从控制台应用程序移植到 asp.net 应用程序。我不知道如何修复类型加载异常,也许您可​​以比我走得更远。如果您确实找到解决方案,请发布。

更新 1(2014 年 12 月 1 日)

更多挖掘揭示了以下程序集绑定错误。知道如何为进程设置包 ID 吗?

文件:WindowsPreview.Media.Ocr!WindowsPreview.Media.Ocr.OcrEngine,版本=255.255.255.255,文化=中性,PublicKeyToken=null,ContentType=WindowsRuntime.htm

文件内容:

* 组装活页夹日志条目(12/1/2014 @ 11:48:01 PM)*

操作失败。 绑定结果:hr = 0x80073d54。该进程没有包标识。

程序集管理器从以下位置加载:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 在可执行文件 C:\Users\Wesley\Documents\Dev\ConsoleApplication2\Program.exe 下运行 --- 详细的错误日志如下。

BEGIN:Windows 运行时类型绑定。 END :进程没有包标识。 (HRESULT 异常:0x80073D54)

更新 2 (12/03/2014)

这是一个令人讨厌的解决方法,但它适用于我的 Windows 8.1 Surface Pro 3 平板电脑。 WebOcr 是一个 web 表单,但它可以很容易地为 MVC 重构

1) 下载https://github.com/Xandroid4Net/CommandLineOcr。这是伪商店应用。

2) 构建并运行应用程序。它似乎什么都不做。没关系,它会使用我们需要的新密钥更新注册表。

3) 下载https://github.com/Xandroid4Net/WebOcr。

4)在Webocr项目中找到OcrCommandLineCaller.cs。

5) 在 HKEY_CURRENT_USER\Software\Classes\ActivatableClasses\Package\Some_Sort_Of_Guid_For_Your_APP\Server\App.App....\AppUserModelId 找到注册表项

如果您需要更多帮助来查找注册表项,请参阅此 SO 问题。 IApplicationActivationManager::ActivateApplication in C#?

6) 使用在注册表项中找到的奇怪 guid 应用标识符更新 OcrCommandLineCaller.cs 中的 appActiveManager.ActivateApplication 调用。

7) 在 default.aspx.cs 中,将 saveAsPath 替换为您机器上的路径。在 Windows 商店应用程序中有一个由 Windows.Storage.ApplicationData.Current.LocalFolder 表示的静态路径。为简单起见,这是我保存图像的路径。

8) 随心所欲地修改任何代码,如果您有任何问题,请告诉我。

这是一个非常粗糙和讨厌的解决方案,但它确实有效。

【讨论】:

谢谢。我今天正在尝试您的解决方案。我在周末不知何故错过了你的更新 2... @user3027550:我在 Visual Studio 中启动了该应用程序并成功启动。但是,没有 ActivatableClassId 密钥的服务器。为什么会这样? 不确定你的意思,你收到什么错误?【参考方案3】:

几年来,我一直在使用 MS Office 附带的 MODI 解决方案,并且对它非常满意(如果您购买了 Office,它是免费的)。当它停产时,我相当失望。 我试过 Tesseract ......我真的很想喜欢它,但发现它对于质量好的荷兰机器类型来说速度慢而且不准确......和你一样,我无法证明花费 200 美元以上的任何东西来购买本质上是一个业余爱好的项目是合理的.

经过绝望的搜索,这里有人将我指向 TOCR(Transym 产品)。顿悟紧随其后。 ;-) 我想我现在需要说的是,我与 Transym 没有任何关系,是的,我支付了全价……60 英镑!(没有错字……60 英镑),其中包括增值税,总计 113 欧元。

它本质上是为集成商设计的(它包括一个扫描/查看器/OCR 应用程序,但这只是一个演示 - 如果您购买许可证,您将获得其源代码)。 API 已经过时(随着 OCR 引擎的发展,它是一个相当成熟的代码库),但它快速、稳定且出乎意料地准确。不如 DokuStar 引擎或其他深奥的引擎准确,但对于我的应用程序(荷兰语和英语机器类型)来说,它可以与 1000 美元以上的各种引擎相抗衡。荷兰机器类型的识别准确性非常好(它不做手写)。 在我看来,就物有所值而言,它简直是可笑的好。 至于 API:我围绕它编写了一个基本的 .NET 包装器以满足我的需要——这是在几个晚上完成的。

在他们的网站 (http://www.transym.com/index.htm) 上有一个评估版本。不,如果你这样做,我不会得到任何钱;-)

【讨论】:

您的链接:www.tocr.com 是一个房地产网站 我对其进行了测试,并且与任何 OCR 一样,它将取决于字体。在我使用它的字体(低分辨率屏幕字体)上,它通常在大多数单词之间放置 2 或 3 个空格,并且完全弄乱了日期或随机字符等数据。它在句子上确实可以接受。【参考方案4】:

我设法通过从 powershell 调用 DLL 从 Web API 调用 OCR。我还发现你不能并行调用这个 DLL。

我花了几天时间,但这里是 repo。可作为 nuget 和 Web API 使用 Windows docker https://github.com/MihaiTheCoder/ocr-all-in-one

我主要为这个问题开发了 Web API 项目,所以希望有人会发现它有用。

调用 Windows OCR 的 powershell 在这里:https://github.com/MihaiTheCoder/ocr-all-in-one/blob/master/Ocr.Wrapper/Resources/Get-Text-Win-OCR.ps1

这是一个 2 阶段的过程,因为 OCR 引擎的初始化需要更多时间,最好将其缓存起来。

【讨论】:

powershell api 调用完美无缺。你这个摇滚伙伴!【参考方案5】:

恕我直言,可能不值得您尝试使用您所针对的平台不支持的库。

您可以查看this answer 以获得一些免费的替代品。

【讨论】:

我尝试了各种开源(包括链接中提到的 Tessaract-OCR)和商业 OCR 库。开源的有缺陷并且没有更新,而商业的成本超过 1000 美元 + 荒谬的版税。 OCR API 每次扫描都会收费,它不符合我的需求,因为我的应用程序将访问我正在构建的 RESTful OCR 服务,它将是免费的。 这个起价为 399 美元:aspose.com/.net/ocr-component/pricing.aspx。另请查看componentsource 了解更多 43 个选项。 谢谢夜猫子。 Compeonentsource 上最受欢迎的价格超过 2,000 美元。 aspose 有一些版税限制。这就是我试图让这个微软工作的全部原因。因为这些商业产品中的大多数要么 1) 太贵了,要么 2) 不能正常工作(我评估了一些试用版)或 3) 尝试为非常广泛可用的东西收取永久收入的特许权使用费...... 我试用了 aspose.com 免费试用版。不确定他们是否有禁用的功能,但它根本不起作用!即使是简单的文档照片,它也会从图像 OCR 功能中为文本提取垃圾。 @Shiva:正在寻找相同的东西:您在此期间有什么发现吗?【参考方案6】:

我设法让 UWP OCR API 使用 uwpdesktop NuGet 在桌面应用程序上运行。

安装包 uwpdesktop

然后您可以调用 UWP API。

【讨论】:

【参考方案7】:

我不是律师,但我的理解是,该库的 Microsoft 最终用户许可协议不允许在您的场景中使用 Microsoft OCR Library for Windows Runtime。

具体来说,请阅读第二段,其中禁止在生产环境中的服务器上使用该软件:

"2. 安装和使用权利。

一个。一般的。一位用户可以安装和使用该软件的副本 设计、开发、测试和演示您的程序。 您不得使用 生产环境中服务器上的软件。”

同时,它们还将可分发代码的运行限制为仅在 Windows Store 或 Windows Phone 上运行:

"3. 额外的许可要求和/或使用权利。

一个。可分发代码。该软件包含您的代码 允许在您开发的程序中分发,如果您遵守 以下条款。

我。 ..

二。 ..

三。分发限制。你可能不会

      ..

· 分发可分发代码以在其他平台上运行 比 Windows 应用商店或 Windows Phone ;"

完整的 EULA 可以在以下位置阅读:https://www.microsoft.com/web/webpi/eula/windows_runtime_ocr_library_terms_of_use.htm

【讨论】:

此 EULA 链接已失效,似乎不再有效。 ocr.space/blog/2015/10/…

以上是关于如何在 ASP.Net MVC4 Web API 项目中使用 Microsoft OCR 库 ( Microsoft.Windows.Ocr )?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC4 Web API MediaTypeFormatter 转换器将 XElement 转换为 JSON

Asp.Net MVC4 Web API - 我们是不是需要 OData 来构建快速查询服务

ASP.NET Web API 从 MVC 4 控制器失败

无法使用 ASP.NET (MVC 4) Web API OData Prerelease 加载文件或程序集 System.Net.Http,版本 = 4.0.0.0

ASP.NET MVC4 部分视图

无法使用 HttpClient 对 ASP.NET Web Api 服务进行身份验证