改进的数字识别算法

                                     改进的数字识别算法实现

一:硬件初始化
主要是相机,LCD,外部SRAM的初始化。,OV7670摄像头一共有110个寄存器, 需要仔细配置:QVGA,RGB565输出。

二:图像预处理
1. 读摄像头数据到内存
在外部SRAM定义2个二维数组:pic_gray[240][320]存一帧灰度图,pic_binary[240][320]存一帧二值图。
连续读取320×240次摄像头输出口的 RGB565值,每读一个,进行灰度转换,保存进pic_gray;二值化,保存到pic_bianry。
每次读的像素是RGB565数据,要转换成灰度图像。位移取出R,G,B分量后,根据转换公式:灰度值=R*0.299+G*0.587+B*0.114,经实践,显示速度1帧/秒,改灰度值=((R*1224+G*2404+B*467)>>12)后,显示速度达到5帧/秒。

  1. 自动寻找仪表读数区域。
    黑白图中,从上到下,下到上,设定黑色像素个数阈值280,统计每行的黑点个数,得到仪表读数区域上下边;同理,设定黑色像素个数阈值100,得到仪表读数区域左右边界。把仪表读数区域的左边界leftbound,右边界rightbound,上边界topbound,下边界downbound保存为全局变量。
    对灰度图pic_gray中该区域内二值化,释放pic_binary,接下来的步骤都是对pic_gray进行操作。

  2. 投影法得到包围数字的最小边框。
    已知仪表读数区域坐标,第一个数字必定落在leftbound到leftbound加上1/3读数区域宽度,topbound到downbound的范围中。把每一竖包含的白色像素点个数投影到长度为1/3读数区域宽度的数组中,找到该数组中连续非0的最长长度及最长非0串的起始点,得到框住数字的最小框的左右边界,类似的,得到框住第一个数字的最小框的上下边界。

  1. 判断最后一位数字完整性。 最后一位数字滚动速度快,常显示不完整,有白色刻度的图像干扰,使得该位数字识别困难。 从仪表读数区域rightbound到rightbound加上1/3区域宽度是最后一位数字所在区域。同上一步一样,对区域内每一竖包含的白色像素点个数做投影。数组中,每一竖拥有白点个数小于1/4仪表读数区域高度的都记为0,这样排除了白色刻度的干扰(一竖白色刻度白点加起来个数不超过高度1/4),得到数组中最长非0串和它的起始结束坐标,即为框住最后一位无论是否完整的数字的左右边界。 在框住数字的左右边界,仪表读数的上下边界这一区域内,对每一行白色像素个数投影到长度为仪表读数区域高度的数组中,统计连续为0串的个数,如果有2个,此时为完整数字,因为当显示完整数字时候,它的上下有连续黑色区域;有三个,说明数字不完整,多出的一个是2个不完整数字之间的黑色区域。

图5:不完整的最后一位数字

图6:完整的数字

三:识别
可根据框住数字最小区域的宽高比,快速判断是否为数字1,所以,不需要样本数字1,共制作了9个90*150大小的数字样本。
模板匹配算法识别数字十分精准,甚至一定范围内灯光,角度的变化对结果都影响不大。原先程序得到框住数字最小区域后,马上对它进行样本0-9的九次次模板匹配得到识别结果。
因为图片邻近插值缩放计算量较大,所以模板匹配是数字识别最占用时间的步骤,要加快识别速度,就要尽量减少模板匹配或者不用。改进后的识别算法增加了2个步骤:统计黑色像素占框住数字最小区域的比率;得到上边,左边的形态特征。结果是能减少了模板匹配次数,最多进行2次,大大的节省了时间。
一:若顶边白色像素个数占宽度比例小于50%,则只可能是数字4,6,进行模板匹配识别。

二:若不符合上一步的条件,则计算框住数字最小区域内的黑色像素占总像素的比率。
黑色像素比例: <20% 20%----40% >40%
可能数字 : 0,8 2,3,5,9 7
1. 黑色像素比率小于20%,做数字0,8的模板匹配,识别得到结果。
2. 黑色像素比例大于40%,得到识别结果为7。
3. 黑色像素比例介于20%至40%,计算框住数字最小区域左边黑色像素个数占比:
a) 若<50%,则可能是2,3,模板匹配得到结果。
b) 若>50%,则可能是5,9,模板匹配得到结果。

Comments
Write a Comment