在VDM中,有三个关于读取LCD、LED七段数码管数字、字符的函数,如下图所示,他们分别是IMAQ Get LCD ROI VI,IMAQ Read LCD VI,IMAQ Read Single Digit VI。其中第一个Get LCD ROI VI与第二个Read LCD VI是需要配合使用的,第三个Read Single Digit VI可以单独使用。如图1所示:
图1 VDM中读取LCD的IMAQ函数
图2 IMAQ Get LCD ROI VI
图2所示为获取LCD的ROI函数。其作用是查找兴趣区域(AOI、ROI)中的七段数码管。这个数码管可以包含多个数码管。为了找到区域中的所有数码管,七段数码管中的所有段(7段)必须是激活的。即要想查找到ROI中的各个数码管的位置,需要将数码管先全部激活成8字,才能保证能找到ROI中的所有七段数码管的位置。
下面看一下这个函数的各接线端。LCD/LED(LCD)接线端,是一个控制端,可以决定需要读取的数码管是更符合LCD类型,还是LED类型。LCD类型的七段数码管每一段是一个整体的。LED类型的七段数码管,每一段是由多个LED点组成的非连续的。
Image图像为需要读取字符的图像引用。必须连接。
ROI Descriptor兴趣区域描述,这个与其它函数一样,这里的ROI Descriptor是全局ROI,即包含了所有的七段数码管的ROI。必须连接。
Threshold阈值,这里的阈值与二值化中阈值不是一个概念。其是判断数码管是否打开的值,是指一个标准偏差,并不是指灰度值,这个标阈值的定义为:沿着一条穿过七段数码管的直线的剖面灰度值的标准偏差大于某个值(指阈值)时认为数码管是打开的。其默认值为8,可以设置更大的值,当图像有较大的对比度时。如果图像对比度不强,可以将阈值设置的比较小。
ROI Descriptor out兴趣区域描述输出,这里的兴趣区域描述输出,与兴趣区域输入是两个不同的兴趣区域。输入的是全局的包含了所有七段数码管的兴趣区域。而输出的是ROI,是指包含了所有七段数码管单个数字的ROI集合,其中可以有若干个ROI共同组成一个ROI数组。
其它两个参数为错误输入、输出。不做介绍。
这个函数,其实类似于其它函数中的一个学习函数。需要先定位到ROI中的数码管位置。然后根据这个位置(ROI Descriptor out兴趣区域描述输出),将其传递给后面的IMAQ Read LCD VI函数。
图3 IMAQ Read LCD VI
IMAQ Read LCD VI读取LCD函数中,多个参数与前面的获取LCD ROI中的参数是一样的,如LCD/LED(LCD),Image,Threshold,error in,error out等。
这里的ROI Descriptor与获取LCD ROI的ROI Descriptor不是一个ROI,这里的ROI描述,需要连接到ROI Descriptor out兴趣区域描述输出。即此读取LCD函数的ROI描述必须由获取LCD ROI函数获得。
Search Sign搜索符号:决定是否需要搜索数码管的符号(即“-”负号)。默认不搜索符号。
Search Decimal Separator搜索小数点:决定是否搜索每个数码管后面的小数点。默认为不搜索小数点。
Output String输出字符串:将读取到的LCD以字符串的形式输出。
Output Value输出值:将读取到的LCD数字以双精度数字形式输出。
Segments status七段数码管状态:在七段布尔量组成一个自定义的族,再将其组成一个数组,以此指示识别到的七段数码管的状态。
图4 IMAQ Read Single Digit VI
读取单个数码管函数相对来讲,就简单一些了,LCD/LED(LCD)、Image、Threshold、Search error in (no error)、Decimal Separator、error out与前面的函数是一个概念。
ROI Descriptor与Get LCD ROI中的ROI描述是一个意思,也是指用户指定的ROI,即这个ROI,可以通过在图像上画ROI的方式直接指定,而不需要其它会获取LCD ROI函数来获取。与其它的图像函数中的ROI是一样的概念。
Sting字符是指识别到的数码管以单个字符方式显示。
Number数字是指识别到的数码管以单个整形(I32)的形式来显示。
Segments status数码管状态,这里仅指单个的数码管,因此只有七个布尔组成的族,没有再构成数组了。
前面两个函数,可以查看NI的例子LabVIEWexamplesVision. ApplicationsLCD Example.vi查看其具体应用。如果前面两个函数应用会了,第三个函数相对更简单。一看就明了。下面我们来也做一个例子来看一下:
图5 读取LCD例子
图5所示的例子,为读取LCD的例子,使用的图片,是使用的是NI自己的例子中的图片。
图6 读取不同数字
图7 读取LCD读取不同亮度的数码管
从图中5~图7可以看到,读取LCD函数有比较好的光源偏包容性,同样的默认阈值8,比较暗时可以识别,比较亮时也能较好的识别。
图8 识别数字与小数点
图8中,只执行了打开图片、画ROI,然后直接执行了3,识别ROI中的数字(多个数码管)。这里我们可以注意一下,画的ROI,只有一个数字及一个小数点。因此是可以识别出来的,从多个字符中也可以看到小数点也能识别。但是这种方法,如果划的ROI包含了多个数码管,而又不执行查找LCD ROI(2),即Get LCD ROI VI,那么程度有可能会崩溃。
图9 识别单个数码管
图9展示了识别单个数码管的例子,可以比较好的识别数字与标点符号。但是单个的数码管不能识别符号。
图10 识别带符号的数码管
从图10中可以看到(初始化ROI为-8位置),识别带符号的数码管,符号位是不会被标识为ROI区域的,因为其仅仅唯有一个符号。
LCD识别因为没有其它的LCD类型的图片,不知道其对LCD、LED的字体等有没有要求。大家有机会可以试验一下。下面的图片为代码部分(简单的事件结构),原始代码请到视觉论坛下载:
LVision-VDM读取LCD字符演示程序与图片_视觉开发模块VDM_图像处理|编程|机器视觉|教程_机器视觉论坛_机器视觉光源_光源控制器_工业相机_工业镜头_图像采集卡_机器视觉方案系统_LabVIEW图像处理_Halcon Vision
http://labviewvision.com/thread-52-1-1.html
图11 打开图像文件
图12 设置新ROI
图13 查找全局ROI中的数码管ROI
图14 识别多个数码管
图15 识别单个数码管
图16 停止程序