经过前几章的学习,我们了解一些简单的窗体文本信息如何获取。但是在实际应用中并不是所有的窗体都能被Microsoft Spy++所识别,比如我们常见的WinRAR解压软件内容窗口就是一个整体,我们无法通过窗口节点来获取其中压缩的内容。就如下图中的Celerys我们通过Microsoft Spy++只能获取到其父级的窗口句柄信息,像这种情况我们就无法通过前面的知识来提取你想要的内容了。
数据采集原理
遇到这种情况我们就需要更强大的功能来帮助我们实现数据的采集,那就是图像识别技术它可以帮助我们解析提取图片中的内容。首先我们还是需要通过句柄来获取到你数据所在的窗口,然后对该窗体进行截图。由于图像识别是一个复杂的识别过程,为了能让图片识别效率更高我们需要对图片进行截取来剔除掉无用的部分以提高识别的效率。现在已经有很多开源的图像识别工具,我们只要利用这些现成的图像识别技术将图片中的数据提取出来即可。
窗口句柄获取
首先我们还是来获取指定窗口的句柄,利用Microsoft Spy++查看窗口对应的类名及标题名称先获取到程序的窗体。再通过窗体句柄来获取窗口句柄,在SysListView32类下面还有个SysHeader32窗口,这个窗口指向的是列表的表头我们不需要获取。
获取窗口大小
在获取窗口图片之前我们需要先来获取窗口的大小,这里我们通过GetClientRect方法来实现。这个也是“user32.dll”中提供的函数,我们添加个函数声明就可以直接使用了。先声明一个struct结构体来存放窗口的坐标值,利用坐标值来计算窗口的大小。
获取窗口图片
这里我们需要通过获得hWnd指定窗口的客户区域的设备环境来创建Bitmap图像,创建图像需要利用到gdi32.dll中的CreateCompatibleBitmap和CreateCompatibleDC来实现。这里需要注意的是需要需要转成ARGB模式,也就是在RGB色彩模式上附加Alpha(透明度)通道。这样可以给图片加亮,提高图片的识别率。
截取图片
图片越大识别起来就越花时间,所以我们在截取到窗口的图片之后需要对图片进行二次处理。这里可以利用Bitmap中的Clone方法来实现图片的截取,提供截取的开始坐标和图片的长宽即可拿到想要的内容。
图像识别
最后就是图像识别了,我们可以利用像Tesseract等光学字符识别库来实现对图像的内容识别处理。在NuGet包管理器中搜索Tesseract并安装,Tesseract支持很多种语言,根据你的需要下载对应的语言包放到项目的tessdata文件夹里面,实例化Tesseract的时候引入tessdata及使用的语言即可。通过Process方法返回一个Page对象,该对象可以获得识别的文本,也可以获得识别文本所在位置。PageSegMode参数设置识别模式,SingleLine表示单行识别。
这里需要注意的是被采集窗口不能最小化,否则无法获取到窗口的坐标值,这样获取图片的时候就会报“内存不足”的错误。
图像识别结果
这里我们发现识别的结果不是很理想(Celerys识别成了Ce‘elys)而且也弹出了警告信息(Parameter not found),参数设置可以在初始化Tesseract组件的时候通过SetVariable属性进行设置。图像识别准确率低可能是图片没做好处理,前面对图像进行ARGB转换和切图就是为了提高Tesseract的识别效率,看来需要去深入研究Tesseract来训练自己的识别库了。
?总结:
是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别各种格式的图像并将它们转化成超过60种语言的文本(不能识别手写内容),同时还可以不断训练自己的库使图像转换文本的能力不断增强。tessdata目录存放的是语言字库及配置文件,用来实现转换不同的语言文本。以上内容是小编给大家分享的【窗体监听006:利用OCR图像识别技术来获取数据】,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
本文暂时没有评论,来添加一个吧(●'◡'●)