找回密码
 立即注册

QQ登录

只需一步,快速开始

druidAAAA

注册会员

11

主题

36

帖子

95

积分

注册会员

积分
95
druidAAAA
注册会员   /  发表于:2017-1-11 18:00  /   查看:6352  /  回复:13
背景:
   我通过.net调用OCR引擎来分析图片,  之前试过 Advantage引擎, 能用但是识别不出我想要的图片
   然后我想试试 Profession 引擎.
   引用里面已经引用了 Forms.OCR.Professiton

问题:
代码编译没错, 而在识别的时候出现一个奇怪的错误:

   System.IO.FileNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生
   其他信息: 未能找到文件“C:\Users\Administrator\AppData\Local\Temp\20018b3cf3b04c1abc4a78d92f7de4fc.tmp”。



初始化代码:
public OCR()
        {
            if (!licenseSet)
                SetLeadToolsLC();

            //ocrEngine =  OcrEngineManager.CreateEngine(OcrEngineType.Advantage, true);
            ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Professional, true);

            // Start the engine using default parameters
            //ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 19\Bin\Common\OcrAdvantageRuntime");
            ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 19\Bin\Common\OcrProfessionalRuntime");

        }


出错的代码段:  (运行时错误)
public string Read(System.IO.MemoryStream img)
        {
            // Create an OCR document
            using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument())
            {
                // Add a page to the document
                img.Position = 0;
                IOcrPage ocrPage = ocrDocument.Pages.AddPage(img, null);

                // Recognize the page
                // Note, Recognize can be called without calling AutoZone or manually adding zones. The engine will
                // check and automatically auto-zones the page
                ocrPage.Recognize(null);

                System.IO.MemoryStream stream = new System.IO.MemoryStream();
                ocrDocument.Save(stream, DocumentFormat.Text, null);

                byte[] buff = stream.ToArray();
                string rsl = System.Text.Encoding.Default.GetString(buff);

                return rsl;
            }
        }


请问这是因为什么原因呢?  似乎少了一个文件
但是用 Advatange 引擎则正常.

多谢前辈们

13 个回复

正序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-1-16 10:10:56
14#
把你的识别方法代码加入了程序中,用Professional Engin识别你的图片得出的结果也是正确的,你这边识别出带标点的结果是否是其他的问题
回复 使用道具 举报
druidAAAA
注册会员   /  发表于:2017-1-13 19:36:27
13#
Richard.Ma 发表于 2017-1-13 15:15
这边测试了确实有问题,我这边之前用的是.net3.5  x64的没有问题,错误原因暂时未知

如我刚才给你发的 ...

这个方法的确比我的更快, 更好. 先多谢.
然而..
为什么我又要说然而....
我都快疯了
对于附件的图片1
Advantage Engin    识别出来的是 "angyangy104"
Professional Engin  识别出来的是 "an.an.104"

---------------------------------------------------------------------------------------------------------------
识别代码如下:
public string Read(System.IO.MemoryStream img)
        {
            // Create an OCR document
            using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument())
            {
                // Add a page to the document
                img.Position = 0;
                IOcrPage ocrPage = ocrDocument.Pages.AddPage(img, null);
               
                ocrPage.Recognize(null);


                // 这里是版主教的新方法
                string rsl = "";
                IOcrPageCharacters chars = ocrPage.GetRecognizedCharacters();
                if (chars.Count > 0) // 因为我的字符只有一行, 所以不遍历所有
                {
                    foreach (OcrWord words in chars[0].GetWords())
                        rsl += words.Value;
                }


                return rsl;




                /* // 这里是以前存为Document的方法
                System.IO.MemoryStream stream = new System.IO.MemoryStream();
                ocrDocument.Save(stream, DocumentFormat.Text, null);


                byte[] buff = stream.ToArray();
                string rsl = System.Text.Encoding.Default.GetString(buff);


                return rsl;
                */
            }
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-1-13 15:15:01
12#
druidAAAA 发表于 2017-1-13 14:52
不要文档, 我只要读取出string, 因为我的程序需要1秒扫描10次左右, 需要效率.
我把源代码发上来啦, 在上 ...

这边测试了确实有问题,我这边之前用的是.net3.5  x64的没有问题,错误原因暂时未知

如我刚才给你发的,如果只是需要取出string的话,可以使用
ocrPage.GetRecognizedCharacters()[0].GetWords()[0].Value;
当然这个只是取出了第一个,全取出来的话需要foreach遍历,这样效率也高
回复 使用道具 举报
druidAAAA
注册会员   /  发表于:2017-1-13 14:52:11
11#
Richard.Ma 发表于 2017-1-13 14:39
如果是要得到文档的话,可以选择保存为想要的格式的文档
如果只是要得到文字结果的话可以参考\LEADTOOLS 1 ...

不要文档, 我只要读取出string, 因为我的程序需要1秒扫描10次左右, 需要效率.
我把源代码发上来啦, 在上面
请过目
回复 使用道具 举报
druidAAAA
注册会员   /  发表于:2017-1-13 14:52:08
10#
Richard.Ma 发表于 2017-1-13 14:39
如果是要得到文档的话,可以选择保存为想要的格式的文档
如果只是要得到文字结果的话可以参考\LEADTOOLS 1 ...

不要文档, 我只要读取出string, 因为我的程序需要1秒扫描10次左右, 需要效率.
我把源代码发上来啦, 在上面
请过目
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-1-13 14:39:23
9#
如果是要得到文档的话,可以选择保存为想要的格式的文档
如果只是要得到文字结果的话可以参考\LEADTOOLS 19\Examples\DotNet\CS\OcrMultiEngineDemo

这个功能以及对应的源代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
druidAAAA
注册会员   /  发表于:2017-1-13 14:33:35
8#
本帖最后由 druidAAAA 于 2017-1-13 16:11 编辑
Richard.Ma 发表于 2017-1-12 16:04
按照代码在这边测试没有问题,如果确实无法解决的话,可以把你的demo和图片传上来,这边做重现

我做个了测试版本的程序发上来.
请直接解压就可以用了.

包括:
1) .zip的源程序
2) 放在"c:\"下的test.pnp
3) 源程序里面为了混合编程模式而修改过的 app.config
     加了代码
      <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
     </startup>

使用方法:
我在OCR类里面设置了一个断点,  在断点前读取 c:\test.pnp, 然后分析
在OCR类里面的初始函数可以设置使用 Advantage或Professional引擎

回复 使用道具 举报
druidAAAA
注册会员   /  发表于:2017-1-13 11:28:27
7#
本帖最后由 druidAAAA 于 2017-1-13 11:31 编辑
Richard.Ma 发表于 2017-1-12 17:20
缓存文件,这个应该是MemoryStream产生的,所以也是在save 的时候报错,可能每个机器确实不一样

我重装了LEADTOOLS后
诡异地...... 错误变成了这个

我初步猜测是LEADTOOLS和我电脑八字不合
有没可能绕过这句
ocrDocument.Save(stream, DocumentFormat.Text, null);
输出MemoryStream?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-1-12 17:20:06
6#
缓存文件,这个应该是MemoryStream产生的,所以也是在save 的时候报错,可能每个机器确实不一样
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部