如何在 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 - 你可以去控制面板 -> 选择 VS2015 -> 点击更改 -> 点击修改 -> 选择通用 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 (MVC 4) Web API OData Prerelease 加载文件或程序集 System.Net.Http,版本 = 4.0.0.0