测试Ocr工具IronOCR(续:编写图片圈选程序)

news2024/10/7 18:21:56

  上一篇文章学习了IronOCR的基本用法之后,计划做一个加载本地图片后,从图片中圈选某一位置的文字,然后调用IronOCR识别圈选区域文本的程序。本文实现从本地加载图片并完成圈选的功能。
  主要的功能包括以下几点:
  1)加载并显示本地图片;
  2)放大缩小图片;
  3)图片的平滑移动;
  4)图片的圈选;
  5)圈选图片的转存与显示。
  首先是加载并显示图片。为便于后续缩放及圈选,并未选择picturebox控件显示图片,而是采用panel控件,并在其paint事件中绘制图片。为避免图片闪烁,需要开启panel的双缓存并设置绘制样式,主要代码如下所示:

	this.SetStyle(ControlStyles.DoubleBuffer, true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    this.SetStyle(ControlStyles.UserPaint, true);
    this.SetStyle(ControlStyles.ResizeRedraw, true);
    this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

  第二是放大缩小图片,虽然Graphics类中的ScaleTransform函数支持设置缩放矩阵,但为便于定位及计算圈选区域,还是定义了单独的缩放系数,并在绘制图片时基于缩放系数实时计算绘图尺寸。同时计算panel控件的最小滚动区域时,也基于缩放系统确定。主要代码如下所示。

	 private void pnlImage_Paint(object sender, PaintEventArgs e)
     {            
         if (m_image != null)
         {
             ...
             
             e.Graphics.DrawImage(m_image, m_startX, m_startY, m_image.Width * m_scale, m_image.Height * m_scale);
				
			 ...
         }
     }  

	 private void UpdateScrollSize()
     {
         if(m_image != null)
         {
             pnlImage.AutoScrollMinSize=new Size(Convert.ToInt32(m_startX*2+m_image.Width*m_scale), Convert.ToInt32(m_startY * 2+ m_image.Height * m_scale));
         }
     }      

  第三步是图片的平滑移动。如果没有设置平滑移动的代码,则滚动panel控件的滚动条时会产生下图所示效果。平滑移动的主要代码如下所示:

	private void pnlImage_Paint(object sender, PaintEventArgs e)
    {            
        if (m_image != null)
        {
        	//加上下面几句代码即可平滑移动滚动条
            e.Graphics.ResetTransform();
            e.Graphics.PageUnit = GraphicsUnit.Pixel;
            e.Graphics.TranslateTransform(pnlImage.AutoScrollPosition.X, pnlImage.AutoScrollPosition.Y);
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            e.Graphics.DrawImage(m_image, m_startX, m_startY, m_image.Width * m_scale, m_image.Height * m_scale);
			...
        }
    }        

在这里插入图片描述

  第四步是图片的圈选。主要是处理panel控件的鼠标按下、移动、按起事件,即鼠标按下时记录圈选的起始位置,鼠标移动过程中实时计算并绘制当前位置与起始位置之间的矩形,最后鼠标按起时将圈选的图片区域转存为另外的图片,也即第五步,为最终的文字识别做准备。
  最后是圈选图片的转存与显示。第四步鼠标按起后,圈选的矩形位置及尺寸已经明确,根据当前的缩放比例计算圈选的矩形在图片中的位置,并调用Graphics.DrawImage函数将圈选的图片区域另存到另一图片中。这里遇到的最大的问题是从本地加载的图片的dpi是72,而在内存中新建的bitmap对象的dpi默认是120,直接调用Graphics.DrawImage函数绘图时会导致圈选的区域和转存的图片内容不一致,如下图所示,这个问题调试了很久才找到原因,最开始的时候一直搞不清楚怎么回事,其实将新建bitmap对象的dpi设置为与加载的图片的一样即可。主要代码如下:

	m_selectImage = new Bitmap(Convert.ToInt32(m_selectRect.Width / m_scale + 1), Convert.ToInt32(m_selectRect.Height / m_scale + 1));
    m_selectImage.SetResolution(m_image.HorizontalResolution, m_image.VerticalResolution);
    Graphics g = Graphics.FromImage(m_selectImage);
    g.DrawImage(m_image,0,0,new RectangleF(Convert.ToSingle((m_selectRect.X-m_startX)/m_scale), Convert.ToSingle((m_selectRect.Y - m_startY) / m_scale), m_selectImage.Width, m_selectImage.Height),GraphicsUnit.Pixel);
    g.Dispose();

在这里插入图片描述

  最终的程序运行效果如下图所示:
在这里插入图片描述

参考文献:
[1]https://ironsoftware.com/csharp/ocr/examples/simple-csharp-ocr-tesseract/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提效降本应对无序竞争,采埃孚+东软睿驰的组合样本

降价与降本,就好似车企与供应商之间的“窗户纸”;如果是持续的无序竞争,势必一捅就破。而只有通过产业链的通力协作,才有机会维持一定的平衡。 多元化需求、车企降本、新车开发周期缩短等一系列因素,正在驱动智能化在中…

Spring Security实现JWT token验证

Spring Security实现JWT token验证 Spring Security是Spring提供的一个安全框架,提供认证和授权功能,最主要的是它提供了简单的使用方式,同时又有很高的灵活性,简单、灵活、强大 一般系统里关于角色方面通常有这么几张表&#xf…

【Dubbo核心 详解三】Dubbo服务接口的详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Dubbo专栏 文章目录 引言一、简介1. 介绍 Dubbo 服务接口的基本概念和特点1.1 Dubbo 服务接口的基础概念1.2 Dubbo 服务接口的特点2. 介绍 Dubbo 服务接口的…

机器学习——SVM的易错题型

问:支持向量机仅可以用于处理二分类任务 答:错误。支持向量机可以用于处理多分类任务,通过使用一对多或一对一的方法,将多个类别分别与其他类别做二分类。也可以使用多类支持向量机算法,直接将多个类别一起纳入训练和…

路侧激光雷达目标检测系统-篇1

说明:又到了毕业的季节,拿出来我之前做的小雷达识别项目,给学弟学妹们做毕设一点参考。这个主要是根据雷达采集的数据包进行聚类识别,看那些是汽车,更改数据的特征之后可以识别特定目标,比如路上新人等。  …

SpringCloud --- Nacos注册中心

一、认识和安装Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 二、服务注册到nacos Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注…

Stable Diffusion公司发布首个大语言模型StableLM,已开源公测!

文 | 智商掉了一地 20号凌晨,Stability AI 发布了一个新的开源语言模型—— StableLM,该公司曾开发了 Stable Diffusion 图像生成工具。这则新闻意味着它不再局限于图像与视频生成领域,将正式加入文本生成 AI 赛道。 StableLM 模型可以生成文…

企业号运营全攻略,让你的品牌更具竞争力

实体企业抖音矩阵运营主要包含以下五个方面:多平台帐号绑定、短视频制作、短视频发布、私信评论维护以及提供数据分析报表。   一、多平台帐号绑定   多平台帐号绑定是实体企业进行抖音矩阵运营的第一步。通过将企业的各种社交账号与抖音账号进行绑定&#xff0…

CoreMark 测试指南

1、coremark 简介 coremark 是由EEMBC提出的一个评价CPU性能指标的跑分软件。其主要目标是测试处理器核心性能。CoreMark程序使用C语言写成,包含如下四类运算法则:数学矩阵操作(普通矩阵运算)、列举(寻找并排序&#…

[2019.01.25]Android NDK Crash错误定位

Android NDK开发Crash错误定位: D:\Users\Android\Sdk ndk-stack.exe: D:\Users\Android\Sdk\ndk-bundle\prebuilt\windows-x86_64\bin aarch64-linux-android-addr2line.exe: D:\Users\Android\Sdk\ndk-bundle\toolchains\ aarch64-linux-android-4.9\prebuilt\windows-x86_64…

六、Golang的并发

Go语言的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为goroutine时,Go会将其视为一个独立的工作单元。这个单元会被调度到可用的逻辑处理器上执行。 Go语言运行时的调度器是一个复杂的软件,能管理被创建的所有goroutine并为其分配执…

对考研考公的过分执念,正在悄悄束缚你的职场选择!

随着近年来就业形势的严峻,越来越多的同学在找工作时碰壁,尤其是对于大部分应届生,这种现象尤为明显。 每年数百万的大学生进入到社会,却发现能选择的机会并不多。高等教育规模不断扩大的背景下,职场晋升的门槛越来越…

Hudi最流行数据湖框架介绍

目录 1. 第一章Hudi 框架概述1.1 数据湖Data Lake1.1.1 仓库和湖泊1.1.2 什么是数据湖1.1.3 数据湖的优点1.1.4 Data Lake vs Data warehouse1.1.5 数据湖框架1.1.5.1 Delta Lake1.1.5.2 Apache Iceberg1.1.5.3 Apache Hudi 1.1.6 湖仓一体(Data Lakehouse&#xff…

【1】从零开始学习目标检测:YOLO算法详解

从零开始学习目标检测:YOLO算法详解 文章目录 从零开始学习目标检测:YOLO算法详解1. 🌟什么是目标检测?2.🌟传统的目标检测与基于深度学习的目标检测3.🌟目标检测算法的工作流程4.🌟目标检测可以干什么&am…

拿到新的服务器必做的五件事(详细流程,开发必看)

目录 1. 配置免密登录 基本用法 远程登录服务器: 第一次登录时会提示: 配置文件 创建文件 然后在文件中输入: 密钥登录 创建密钥: 2.部署nginx 一、前提条件 二、安装 Nginx 3.配置python虚拟环境 1.安装虚拟环境 …

自习室管理系统的设计与实现(论文+源码)_kaic

摘要 近年来,随着高校规模的逐步扩大,学生对高校自习室座位的需求也在不断增加。然而,一些高校仍然采用人工管理学院自习室座位,这大大降低了管理效率。显然,开发一个成本低、占用资源少、能提高高校自习室座位管理效率…

WindowsHash简介及windows认证

Windows系统使用两种方法对用户的密码进行哈希处理,他们分别是LAN Manager(LM)哈希和NT LAN Manager(NTML)哈希。 现在已经有了更新的NTLMv2以及Kerberos验证体系。 Windows的系统密码hash默认情况下一般由两个部分组成:第一部分是LM-hash,…

Nginx中间件漏洞复现

Nginx 解析漏洞 该漏洞与nginx、php版本无关,属于用户配置不当造成的解析漏洞。 漏洞原理: 该解析漏洞是PHP fastcgi 的漏洞,在PHP的配置文件 php.ini 中有一个关键的选项 cgi.fix_pathinfo 默认值为1,表示开启。同时在 php-fp…

ASO优化之如何回复Google Play评论

应用的平均评分会影响 Google Play 商店优化 和应用的 Google Play 排名。应用的评分越高,我们在搜索结果中的排名就越靠前。因此,当应用处于 4 星评级范围内时,它会被更多 Google Play 商店的访问者看到和发现。我们可以使用应用雷达中的评级…

Linux进程通信:有名管道

有名管道: 无名管道只能用于有亲缘关系的进程间通信。 因此提出有名管道(也叫FIFO文件),以实现无亲缘关系进程间的通信。 不同于无名管道,有名管道FIFO文件的形式存在于文件系统,与一个路径名关联&#xff…