当前位置: 首页 > 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培训的张孝祥
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • es6(二):字符串的扩展
  • GitUp, 你不可错过的秀外慧中的git工具
  • Hexo+码云+git快速搭建免费的静态Blog
  • in typeof instanceof ===这些运算符有什么作用
  • laravel with 查询列表限制条数
  • LeetCode29.两数相除 JavaScript
  • Python爬虫--- 1.3 BS4库的解析器
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue2.0项目引入element-ui
  • Webpack入门之遇到的那些坑,系列示例Demo
  • zookeeper系列(七)实战分布式命名服务
  • 构建工具 - 收藏集 - 掘金
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 和 || 运算
  • 漂亮刷新控件-iOS
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何用vue打造一个移动端音乐播放器
  • 软件开发学习的5大技巧,你知道吗?
  • 我的面试准备过程--容器(更新中)
  • 新版博客前端前瞻
  • 一些css基础学习笔记
  • 优化 Vue 项目编译文件大小
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (TOJ2804)Even? Odd?
  • (十) 初识 Docker file
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)VC++中ondraw在什么时候调用的
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • *p++,*(p++),*++p,(*p)++区别?
  • .Net 6.0 处理跨域的方式
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 事件模型教程(二)