当前位置: 首页 > news >正文

.NET中两种OCR方式对比

1.使用 Tesseract 
Install-Package Tesseract


2.从这里下载实例项目(为了获得训练数据)
tessdata目录下的就是训练数据,等下初始化Tesseract引擎对象会使用。


测试代码:
  
private static void TesseractSample()
        {
            var testImagePath = "phototest.tif";
            try
            {
                using (var engine = new TesseractEngine(@"..\..\tessdata", "eng", EngineMode.Default))
                {
                    using (var img = Pix.LoadFromFile(testImagePath))
                    {
                        using (var page = engine.Process(img))
                        {
                            var text = page.GetText();
                            Console.WriteLine("Mean confidence: {0}", page.GetMeanConfidence());


                            Console.WriteLine("Text (GetText): \r\n{0}", text);
                            Console.WriteLine("Text (iterator):");
                            using (var iter = page.GetIterator())
                            {
                                iter.Begin();


                                do
                                {
                                    do
                                    {
                                        do
                                        {
                                            do
                                            {
                                                if (iter.IsAtBeginningOf(PageIteratorLevel.Block))
                                                {
                                                    Console.WriteLine("<BLOCK>");
                                                }


                                                Console.Write(iter.GetText(PageIteratorLevel.Word));
                                                Console.Write(" ");


                                                if (iter.IsAtFinalOf(PageIteratorLevel.TextLine, PageIteratorLevel.Word))
                                                {
                                                    Console.WriteLine();
                                                }
                                            } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));


                                            if (iter.IsAtFinalOf(PageIteratorLevel.Para, PageIteratorLevel.TextLine))
                                            {
                                                Console.WriteLine();
                                            }
                                        } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
                                    } while (iter.Next(PageIteratorLevel.Block, PageIteratorLevel.Para));
                                } while (iter.Next(PageIteratorLevel.Block));
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected Error: " + e.Message);
                Console.WriteLine("Details: ");
                Console.WriteLine(e.ToString());
            }


            Console.WriteLine("Press anykey to end");
            Console.ReadKey();
        }




使用MS cognitive做OCR
1. 有一个Cognitive 的账号。
2. 准备一个测试图片

3. 测试代码:

...
 MS_OCRApi("phototest.tif");
...

    static async void MS_OCRApi(string pathOfImage)
        {
            
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);


            const string API_KEY = "{your key}";


            // Request headers
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", API_KEY);


            // Request parameters
            queryString["language"] = "unk";
            queryString["detectOrientation "] = "true";
            var uri = "https://westus.api.cognitive.microsoft.com/vision/v1.0/ocr?" + queryString;


            HttpResponseMessage response;


            // Request body
            byte[] byteData = File.ReadAllBytes(pathOfImage);


            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/octet-stream");
                response = await client.PostAsync(uri, content);


                var s = new MemoryStream();
                await response.Content.CopyToAsync(s);


                var str = Encoding.UTF8.GetString(s.ToArray());
                var results = JsonConvert.DeserializeObject<MsOCRResult>(str);


                Console.WriteLine("Results :");
                var lines = results.regions.SelectMany(x => x.lines);
                foreach (var ocrLine in lines)
                {
                    Console.WriteLine(ocrLine);
                }




                Console.ReadKey();
            }
        }




对比两种OCR:
1. MS Cognitive Service是RESTful api based,支持多种客户端而且不用关心机器学习过程,但是收费(每月5000个call,1分钟20个call免费)。不过可考虑使用缓存来降低成本。
2. Tesseract是dll based。因此需要不断更新训练数据,如果需要支持多客户端,需要自己wrap一个RESTful。好处就是免费。

相关文章:

  • LWUIT在不同手机上的性能差异
  • C# 单元测试EntityFramework中的DbFunctions中的函数
  • 菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
  • 【译】微软 azure -- 机器学习算法选择的步骤
  • ERROR: ORA-01034: ORACLE not available ERROR:ORA-01034ORA-27101的解决方法
  • Android Studio 编译错误DuplicateFileException
  • 如何获取SQL Server数据库里表的占用容
  • 关于面向对象中的代码审查(Code Review)
  • 数据挖掘常用的心脏病数据(From UCI)
  • LeetCode -- Count of Smaller Numbers After Self
  • LeetCode -- Valid Perfect Square
  • LeetCode -- Russian Doll Envelopes
  • 查看sql server数据库的空间大小...
  • LeetCode -- Longest Palindrome
  • 有朋远方来-致力于java培训的张孝祥
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【Amaple教程】5. 插件
  • 03Go 类型总结
  • Docker 笔记(2):Dockerfile
  • JavaScript创建对象的四种方式
  • js对象的深浅拷贝
  • Mithril.js 入门介绍
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Selenium实战教程系列(二)---元素定位
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue脚手架vue-cli
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 大型网站性能监测、分析与优化常见问题QA
  • 大整数乘法-表格法
  • 浮动相关
  • 京东美团研发面经
  • 聊聊flink的TableFactory
  • 强力优化Rancher k8s中国区的使用体验
  • 入门到放弃node系列之Hello Word篇
  • 设计模式走一遍---观察者模式
  • 使用 QuickBI 搭建酷炫可视化分析
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小程序button引导用户授权
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #LLM入门|Prompt#3.3_存储_Memory
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (4)Elastix图像配准:3D图像
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十一)c52学习之旅-动态数码管
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)求1到1亿间的质数或素数
  • (新)网络工程师考点串讲与真题详解
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON