NI视觉范例之OCR
LabVIEW Vision-NI视觉范例之OCR字符识别
LabVIEW Vision-NI视觉范例之OCR字符识别
OCR是机器视觉应用中比较常见的一种应用。在NI视觉中,大部分的视觉版本中都有类似的OCR字符识别例子。本章内容是以NI Vision 2014版本介绍的。因此打开这个OCR例子,也是需要2014版才可以的。
下面来具体介绍一下函数的程序面板:
NI视觉范例之OCR程序面板
NI的范例通常都是比较简单的,一个While循环基本上就解决了所有问题。没有太多高深的应用,不过对于初学NI LabVIEW图像处理的学生来讲,这种最简单的应用是比较适合的。这个程序主要的一个部分就是While。在While左边的部分,都可以认为是初始化。即程序的初始化过程。在While的右边则为程序退出时的一些清除功能。
在正规的程序设计中,这个初始化过程也是需要有的。但是具体初始化些什么内容,是需要选择的。本例子中,初始化的内容包含了三个部分,一个是初始化了查找字符的兴趣区域ROI:
查找字符的兴趣区域ROI
这个过程,其实是没有太多必要的,实际应用中,这种方法是非常少用而且是不可取的。一般都是直接考虑使用Image控件中的ROI工具画兴趣区域,然后再通过Image控件的ROI属性,将ROI区域值传递给需要的函数,在本示例中,为IMAQ OCR Read Text3函数,可以示意为:
优化ROI后的示例程序
优化ROI兴趣区域后的效果
可以在图像中随意的设置ORI兴趣区域,从而得到想要的字符。
初始化中另一个初始化的内容,则为字符集文件的打开:
字符集文件的打开
在这里首先使用了IMAQ Vision Example folder.vi函数打开NI视觉的例子文件夹,这个函数里是NI自编的一个函数,可以双击打开查看内容,可以看到,其在Windows系统下,是利用注册表来查找NI软件在安装时注册的视觉路径来实现打开视觉例子路径的。
IMAQ Vision Example folder.vi函数
打开了视觉的例子文件夹路径再后使用相对文件夹与相对文件,来创建了字符集文件的路径。同时使用IMAQ OCR Create Session函数节点来打开一个新的字符集引用。这种方式在LabVIEW文件操作中最为常见。INI、WORD、EXCEL、XML、数据库等,都是这样的方式打开的,首先都是需要创建一个引用才可以进行后续的操作的。之后再使用IMAQ OCR Read Character Set File VI来读取字符集文件。
IMAQ OCR Read Character Set File VI读字符集文件函数
File Path文件路径:字符集文件的路径,即连接刚才创建的字符集文件路径。
IMAQ OCR Session字符集引用:连接OCR Create Session后的引用。
Append to Character Set?(F)添加字符集?:是否将File Path中指定的字符集文件添加到Session中的字符集当中。默认为False假,则不为添加,而是使用File Path中的字符集替换当前Session中的字符集。如果是True真,则添加到当前的字符集引用中。这在需要打开多个字符集文件时,可以设置为T。
Read Options读选项:即读取字符集文件的方法。有Read all读取所有。包含了文件中的字符集数据和引用属性;第二种是Read Character Set Only只读取字符集数据;第三种是Read Properties Only只读取属性。一般来讲使用第一种Read all读取所有即可。
Read Options读选项
IMAQ OCR Session(dup)字符集引用输出。
Character Set Description字符集描述:如果字符集在创建保存时有描述的话,在这里可以读取到相关的信息。
初始化过程中,还有第三块内容需要初始化,即初始化打开的图片路径:
初始化打开图片路径
这个也是基于已经创建的OCR文件夹而来的,将根据这个文件路径确定文件夹,然后在Wihle中使用快速VI来循环读取文件夹中的图像文件。
While循环内部,基本上就是一个程序的真正执行过程了。在本OCR示例程序中,包含了五个函数。每个函数都有其相关的内容,有些函数是必须要有的,有些函数,则是可有可无的,甚至是多余影响效率的。下面来分别介绍一下:
图像采集部分
这里的图像采集部分,使用的是快速VI,并且是仿真采集得到某个文件夹中的所有图像。这个功能其实是可以自己编辑的,不一定非得要使用快速VI。使用罗列文件夹中的文件函数,配合文件夹路径,即可实现读取所有的图片功能。
这里也可以使用实际的相机采集函数,从相机中获得图像。具体的采集图像的功能,可以参考机器视觉论坛其它相关的文章,很多文章中都有图像采集部分的功能。
清除覆盖Clear Overlay
在本程序中,清除覆盖功能,本身是多余的。因为并没有循环利用已经覆盖过的图像。因此新加载的图像也不会有覆盖在上面的其它Overlay图层,所以这个清除是多余的。只有当有需要重复使用有覆盖的图像时,才会考虑使用这个函数。这种情况下如果不清除覆盖,则会将历史的覆盖与当前的覆盖都覆盖在图像上,从而图像显示会很乱,也有可能不知道到底哪个才是最终的结果。
删除Clear Overlay函数后不影响功能
字符识别读取字符函数IMAQ OCR Read Text3
IMAQ OCR Read Text3
这个读取字符函数就是本示例中的核心图像处理程序,要想读取到字符,就必须使用此函数才可以实现。
IMAQ OCR Read Text3
读取字符函数,其实是比较简单的。
ROI Descriptor兴趣区域:即用于确定需要读取字符的区域。如果ROI区域不连接,则使用整个图像进行字符识别。
IMAQ OCR Session字符集引用:字符集文件的引用输入端。
Image图像:需要识别字符的原始图像。
Orientation方向:字符识别的ROI可以是矩形、旋转矩形、以及环形、扇形四种类型。其中使用环形、扇形ROI工具时(同一个ROI),因为其是一个环形的。因此读取字符时,可以有两种方向,即一种是基线在内Baseline insight(默认),这种方法将读取字符数据沿内圆的边缘方向。通常情况下,这种方法将按顺时针方向读取字符。而另一种是基线在外baseline Outside,这种方法将读取字符数据沿外圆的边缘方向,通常情况下这种方法将按逆时针方向读取字符数据。
Character Reports字符报告:用于显示字符识别的结果报告。包含了识别的每个字符的值、分类分数、检验分数、是否已经检验、以及字符的统计信息(包含了每个字符的阈值范围、左偏移量-相对ROI区域的左距离、顶偏移量-相对ROI区域的顶距离、字符的宽度、高度、大小等)。这些字符的值与对应的ROI的区域可以用于一些字符识别的方向判断。同样的一串字,如果旋转180度后,其位置与原来的是相反的,如果有需要做方向判断,则可以利用其左偏移、顶偏移等作为 判断依据。
字符结果报告
Image(dup)图像:图像复本输出。
Read String读取到的字符:即最终读取得到的字符串结果。
ROI Bounding Characters字符的外接矩形兴趣区域:即每个识别到的字符的外接矩形区域。这里的输出,将连接到后面的Overlay ROI函数的ROI输入端,用于将识别到的字符显示出来。
在本示例中,使用的是OCR Read Text3函数,而在2013版以后,NI Vision中内置的是OCR Read Text4函数。
IMAQ OCR Read Text4函数
在Read Text4函数中,多了一个Number of lines Requested需要读取行数输入端,因为在2013版以后的OCR函数中,在一个ORI中可以识别多行文本。因此这里有需要读取的行数指定端口。不连接时,将自动识别ROI中可能的文本行数。Number of Lines读取到的行数用于输出当前ROI中读取的文本行数。
字符识别默认情况下,在选项上是没有直接显示是否需要覆盖结果的,其只有一个结果的ROI输出。因此要想在图像中显示这个结果,还得自己添加覆盖兴趣区域函数进行覆盖添加。
IMAQ Overlay ROI覆盖兴趣区域
覆盖函数,一般来讲是可选的。如果为了结果直观,可以显示,如果为了速度考虑,则可以不显示。这样可以加快一些处理的速度。
延时
延时,在本例子中有用的。因为对于初学者,可能需要查看一下具体的处理效果。但是这种功能在具体的实用程序中,是不需要的。这里的延时使用的是快速VI中的延时。也可以直接使用等待函数进行延时。
清除
当程序结束后,一般不会直接就停掉,在停止之前,还会有一些清除保存等的操作。在本示例中,需要清除图像缓存、需要释放字符集文件的引用,还有一个简单的错误处理。