高反光柱面金属上的二维条码图像识别方法 【技术领域】
本发明涉及对高反光柱面金属上的 DataMatrix 二维条码进行信息提取的方法, 属于自动识别技术领域。背景技术
直接零件标识 DPM(Direct Part Marking) 技术是一种可直接在产品的表面形成 包括文字、 符号或图案等形式的永久标识技术, 利用 DPM 技术在产品表面形成的一维条码 或二维条码符号, 是实现产品可追溯性标识的重要技术手段, 在条码符号的选择上, 考虑到 产品表面面积有限、 提高符号识读率等因素, 目前多选用二维 DataMatrix 条码作为产品的 二维条码永久标识, 这是因为 DataMatrix 条码编码容量大、 密度高、 纠错能力强。
目前二维条码识读方法上都采用 CCD 摄像头采集含有二维条码的图像, 再对图像 进行一系列处理, 去除背景定位条码区域, 然后提取条码数据信息。现有的二维条码识读 系统只能处理平面状态下完整的、 形变不严重及光照比较理想情况下的二维条码图像。而 DPM 所标识的零件或刀具很少具有平面表面, 大都为圆柱形的, 并且所标识的表面多为光滑 的金属材质, 所以摄像头所采集的图像通常含有较强的反光、 光照不均及对比度低等现象, 同时条码形状会有一定程度的扭曲。 对于曲率比较大的圆柱形表面甚至会有反光区域覆盖 码区, 导致条码信息损失。 针对金属柱面上标识的二维条码这些特有的繁杂情况, 现有条码 识别技术无法处理, 譬如日本 Cognex corp 出产的手持式 Dataman 7500 和封闭式读码器 MATRIX2000, 都无法识读标刻在光滑的圆柱形金属材质上的二维 DataMatrix 条码, 从而限 制了二维条码技术在 DPM 中的应用。 申请号为 “201110100489.6” , 发明名称为 “一种金属柱 面直接标刻二维条码识读装置及识读方法” 的专利, 从硬件方面设计了如何消除柱面高光, 但软件方面并未实现。 发明内容 为了克服现有技术仅从硬件层面上消除柱面高光的不足, 本发明提供一种高反光 柱面金属上的二维条码图像识别方法, 有效地实现了二维条码的读取。
本发明解决其技术问题所采用的技术方案包括以下步骤 :
第一步, 初定位二维条码区域 :
1. 定位二维条码的横向位置 :
从图像横向中间 w/2 处, 向左遍历求取竖向梯度 :
其中, gradi 代表图像 A 中 i 列的梯度值, 设在 i = xleft 处, 取得最大梯度值, w 为图像宽度, pixi, 用同样的方法从图像横向中间 j 代表现图像中 i 列 j 行像素点的像素值 ; w/2 处, 向右遍历求取竖向梯度, 设在 i = xrigt 处, 取得最大梯度值。
2. 通过投影法确定二维条码的纵向位置 :
求取图像 A 竖向区域投影值 :得到一组投影值求取这组投影值的平均值遍历每个值,若则使 projj = 0 ; 再次遍历记下每一个连续并不含有 0 的连通区域, 设最长的一个连通域起始点和结束点为 yup 和 ydown。
通过以上操作, 可初定位条码所在区域, 本发明认定横向 xrigt = xrigt-5, xlef = xleft+5, 纵向 yup = yup+5、 ydown = ydown-5 确定的区域为二维条码区域。
第二步, 校正柱面光照不均 :
本发明利用 6 次多项式插值公式模拟横向像素的渐变曲线, 并利用等距节点的牛 顿插值法计算横向渐变曲线的插值公式, 步骤如下 :
1. 建 立 横 向 节 点 值 数 组 其中, n 表示遍历投影值计算中 projj = 0 的数目。
2. 节点间距 h = (xrigt-xleft)/6, 插值节点数组为 3. 设 横 向 像 素 的 渐 变 曲 线 函 数 f(x) 在 插 值 节 点 处 函 数 值 数 组 利用牛顿插值法求出 6 次多项式插值公式, 设为 N6(x), 其中 x =xleft+th, t = 0, 1, ..., 6。
4. 以的平均值作为基准值, 求取逆向校正数组 5. 根据逆向校正数组校正二维条码区域 :
{pix|pixi, xleft ≤ i ≤ xrigt ydown ≤ j ≤ yup} j = pixi, j-v(xi),
校正完二维条码区域后, 通过 (xrigt, ydown), (xrigt, yup), (xleft, ydown), (xleft, yup) 四个顶点为基准裁切原图像, 再对裁切完后的图像四周加上 20 像素长度 的 0 值像素, 得到图像 A1。并将图像宽度和高度重新赋值, w = xrigt-xleft+20, h= yup-ydown+20。
第三步, 精确定位条码四边缘 :
1. 求取码区主方向 :
1) 首先对图像 A1 做灰值形态学边缘梯度运算 :为灰值膨胀运算, Θ 为灰值腐蚀运算, g 为半径为 2 个像素的圆形结构元素, 得到梯度图像 A2, 再对 A2 做大津阈值分割得到二值图像 A3。
2) 建立一个二维条码边缘方向数组每个 di 代表着一个 11.25°的区间。
3) 扫 描 A3, 若 pixi,j = 255, 求 取 此 点 在 A2 中 的 sobel 梯 度 方 向 drei,j = arctan(dyi, 其中 : j/dxi, j),dyi, j = (pixi-1, j+1+2pixi, j+1+pixi+1, j+1)-(pixi-1, j-1+2pixi, j-1+pixi+1, j-1) dxi, j = (pixi+1, j+1+2pixi+1, j+pixi+1, j-1)-(pixi-1, j+1+2pixi-1, j+pixi-1, j-1) 若 drei, 则 value(di) 加 1, 直至扫描完 A3 中全部像素点。 j ∈ di, 4) 遍历 计算区间加权值 :valued = 0.3×value(di-1)+0.4×value(di)+0.3×value(di+1)
其中, di-1 表示 di 逆时针方向的上一个取值, di+1 表示 di 顺时针方向下一个取值, d0 到 d15 是一个圆形循环区间。设在区间 di 处加权值最大, 记 di 中点值 dfirst, 和 di 相隔 8 个的区间的中点值记为 dsec, 二维条码的两个大致主方向求取为 dfirst 和 dsec。
2. 去除噪声并粗定位 :
1) 以 dfirst 为方向的两条直线和以 dsec 为方向的线分个顶点开始遍历 A3, 遍历的间距为 2 个像素, 将这四条直线记为遍历直线, 用字母 lline 表示。 2) 记 录 在 遍 历 直 线 lline 上 像 素 值 为 255 的 像 素 点 坐 标, 用 集 合 {(i, j)|(i, j) ∈ lline && pixi,j = 255} 表示, 判断集合中每个像素点的八邻域像素点的像素值, 将八 邻域中像素值等于 255 的像素点都计入集合中。
3) 判断遍历直线 lline 所对应集合, 若集合中元素个数大于阈值 Th1, 且集合中 坐标点的的方差大于阈值 Th2 时, 确定为条码区域, 停止此次遍历并记下停止位置, 其中,
4) 判断从四个顶点开始的遍历有没有全部结束, 若没有则选择没有遍历过的顶点 转到步骤 2) 开始遍历, 若全部结束则转向步骤 5)。
5) 将四个停止位置处的遍历直线所围成的区域记为粗定位二维条码区域, 并将粗 定位二维条码区域之外的区域全部赋值为 0, 这样就去除了大部分污染。
3. 精确定位条码边缘 :
1) 分别从上向下, 从下向上, 从左向右, 从右向左扫描 A3, 得到一组像素值都为 255 边缘点, 将这些点的集合记作 E, 并将图像 A3 中非边缘点都置为 0。
2) 对集合 E 中的所有点作霍夫变换, 得到 ρ-θ 坐标系下的霍夫变换域, 其中 ρ
是极半径, 取值范围θ 是极角, 取值范围 [dfirst-10, dfirst+10] 和[dsec-10, dsec+10]。
3) 利用模板遍历霍夫变换域, 模板是一个 5*5 正方形区域。设中心点对应的霍夫 点为 (θi, ρi), 则正方形区域中点 (θi-1, ρi), (θi+1, ρi), (θi, ρi-1), (θi, ρi+1) 对应 的权值 p0 = 0.6, 点 (θi+1, ρi+1), (θi+1, ρi-1), (θi-1, ρi+1), (θi-1, ρi-1) 对应的权值 p1 = 0.4, 点 (θi-2, ρi), (θi+2, ρi), (θi, ρi+2), (θi, ρi-2) 对应的权值 p2 = 0.2。正方形 模板最中间是遍历目标点的坐标, 其他对应的是目标点周围点的坐标, 模板横向是 θ 轴方 向, 纵向是 ρ 轴方向。遍历霍夫变换域中 (θi, θi), 根据模板计算公式求取模板值 T(θ, θ) :
其中是点 (θ, ρ) 对应的值, 在模板遍历霍夫域的过程中, 如果模板中的点 舍去此模板点 ; 如果 θ1 超出 θ 轴的范围 或 得到新的ρ1) : ρ1 超出 ρ 轴的范围 (θ1, 则将此点代换为点, 并将此新的点的值代入模板计算公式求取模板值。
4) 用模板遍历完霍夫域后, 假设点 (θj, ρj) 对应的 5) 求取最大, 则 (θj, ρj) 对应的图像坐标系中的直线 ρj = xcosθj+ysinθj 为最长直线。
模板上的所有的点在图像 A3 中对应的直线, 并检测图像坐标系中在这些直线上并像素值等于 255 的点, 称这些点为拟合点, 记录这些点并根据这些点做最 小二乘拟合, 拟合直线即为 DM 码的一条边缘直线。
6) 在霍夫域中清空上一步检测出的边缘直线的 (ρ0, θ0) 及其领域, 判断本次检 测直线是否为第四条直线, 若否再转到步骤 2) 检测下一条边缘直线 ; 若为第四条直线转到 步骤 7)。
7) 求取四条边缘直线相互垂直的两两直线交点, 共得四个交点。拟合点最多的 边缘直线默认为二维条码的一条实边拟合直线, 与其在同一个 θ 极角区间的拟合点最多 的边缘直线为第二条实边拟合直线, 两条实边拟合直线的交点为二维条码左上顶点, 记为 (x0, y0), 另外两条边缘直线则默认为二维条码的虚边拟合直线, 其交点为二维条码右下顶 点, 记为 (x3, y3), 其余的两交点记为 (x1, y1)、 (x2, y2)。
8) 求取 (x0, y0) 和 (x3, y3) 连线的实际角度与理想状态 3π/4 之间的角度差 :
θ = atan[y0-y3, x0-x3]-3π/4。
将另外两交点按角度 θ 逆时针旋转, 求取旋转后 x 值 : x1′= cosθ*x1+sinθ*y1, x2′= cosθ*x2+sinθ*y2, 旋转后 x 值大的认为是右上顶点, x 值小的则认为是右下顶点, 将 (x1, y1)、 (x2, y2) 中旋转后 x 值大的点赋值给 (x1, y1), x 值小的点赋值给 (x2, y2)。
9) 二维条码的四个顶点精确坐标即为 : (x0, y0)、 (x1, y1)、 (x2, y2) 和 (x3, y3), 分别 代表本次待识别二维条码的左上、 右上、 左下和右下四个顶点。
第四步, 判断输出数据是否满足校验函数 :
1. 判断四个顶点的坐标有无超出横向 (15, w-15) 范围与竖向 (15, h-15) 范围, 若 至少有一个超过, 则认为定位没有成功, 输出否定值 ; 若都没有超过则转向步骤 2。
2. 求取 (x0, y0) 与 (x1, y1) 之间的线段长度 l0、 (x1, y1) 与 (x2, y2) 之间的线段长 度 l1、 (x2, y2) 与 (x3, y3) 之间的线段长度 l2 以及 (x0, y0) 与 (x3, y3) 之间的线段长度 l3, 得 到一组线段长度数组 计算比值 {lm/ln(m ≠ n)&&m, n ∈ [0, 3]}, 如果比值都在 0.8 ~ 1.2 之间。则默认上述方法已精确确定二维条码边缘, 输出确定值 ; 若否则判定二维条码边 缘未能精确确定, 输出否定值
3. 若效验结果最终为确定值, 转到第六步继续执行 ; 若为否定值, 转向第五步, 采集多幅图像并融合识别。
第五步, 采集多幅图像并融合 :
1. 调节黑色金属挡板使夹缝变小, 直到相机抓取的图像没有高反光带覆盖条码区 域为止, 此时夹缝之间的条码区域只是整个二维条码区域的一部分。
2. 调节相机拍摄时间为 0 ~ 4 秒, 相机抓取图像帧数为 0 ~ 10 幅。
3. 设抓取的帧数为 f 幅, 旋转时间为 t 秒, 旋转柱状金属每隔设 f/t 秒抓取一幅图 像, 得到一组图像序列
4. 利用步骤一的方法初定位图像序列中每个图像的二维条码区域,得到一组二维条码区域图像序列 样的,
由于对应同一夹缝宽度, 所以图像宽度是一代表图像序列的图像大小, 其中 w 和 hp 代表图像 MvAreap 的宽度和高度。5. 对于 MvAreap, 求取图像中每个像素点的横向和纵向的一阶导数 gx 和 gy, 以及两 2 者的乘积 gxgy, 然后计算原图像上对应的每个像素点的兴趣值 I = det(M)-k*tr (M), 其中, k 为权值系数, 取 0.04, 为高斯模板, det 为矩阵行列式, tr为矩阵的迹。
6. 将图像 MvAreap 上的兴趣值最大值记为 Imax, 以 0.05*Imax 作为阈值, 判断每个像 素点的兴趣值是否为其 20*20 像素邻域内的最大值, 若为最大值且兴趣值大于 0.05*Imax, 则将此像素点记为 MvAreap 图像的 Harris 特征点。 遍历图像 MvAreap 可得到特征点集 Harp。 7. 重复步骤 5 和 6, 循环图像序列 可得特征点集序列为 对 于 i > 0, 图像 MvAreap 和 MvAreap-1 之间只有平移变化, 并且通过初定位得到的 MvAreap 和 MvAreap-1 之间竖直位移很小, 所以建立位移矩阵 :
8. 遍历位移矩阵 R, 设此次遍历的位移元素为 (x, y), 设 Ii 是 Hari 中的特征点, 坐 标设为 (xi, yi)。
在 Hari-1 中寻找距离 (xi+x, yi+y) 最近的特征点 Ij, 坐标设为 (xj, yj), 分别取 Ii 和 Ij 的 4×4 邻域 A 和 B, 求取这两个邻域的互相关系数 :
其中 和 分别为邻域 A 和邻域 B 的像素平均值, σ(A) 和 σ(B) 为标准差, Auv 与 从 -1( 两区域完全不Buv 分别代表 Ii 与 Ij 的 4×4 邻域每个像素点的像素值。 , 可以看出 同 ) 到 1( 两区域完全相同 ) 变化。
求取的高斯加权距离15其中 rij = ‖(xj, yj)-(xi+x, yi+y)‖102354363 A CN 102354372说明书6/13 页为特征点 Ij 与 (xi+x, yi+y) 之间的欧氏距离, σ 为控制这两点之间相互作用的参数, 本发 明取 σ = hi-1/8。
9. 计 算 MvAreai 和 MvAreai-1 在 位 移 (x, y) 下 的 特 征 点 平 均 配 准 度 设在位移 (xm, yn) ∈ R 处 Re g(x, 则 y) 取得最大值, yn) 与 MvAreai-1 达到最佳配准融合 ; 然后判断 xm > w/3, 若 认为图像 MvAreai 经过位移 (xm, 成立则配准融合成功, 若不成立则认为 MvAreai 与 MvAreai-1 重合度过高, 没有必要再融合 ; 然后删除 MvAreai 并将其后的图像序号依次减 1, 譬如 MvAreaj = MvAreaj-1(j > i), 然后重 复步骤 5 ~ 9。
10. 若将图像序列全部融合完毕, 则得到一幅新的融合后的图像 A1。 A1 本步完毕后转向第三的宽度为融合后图像的实际宽度, 重新赋值给 w, 高度步继续顺序执行。
第六步, 仿射变换校正图像 :
对于原始真图像 f(x, y) 到变换后图像 g(x′, y′ ) 的空间变换, 设变换后对应的 四个顶点坐标为 : (x0′, y0′ )、 (x1′, y1′ )、 (x2′, y2′ ) 和 (x3′, y3′ ), 设并设变换方 程为 :
先在 x 方向上进行线性插值, 即 l1 上进行线性插值 : where 再在 l2 上进行线性插值 : where 然后在 y 方向上进行线性插值 : where R2 = (x′, y′ ) R2 = (x′, y1′ ) R1 = (x′, y0′ )由上述三个公式可由一维推向二维, 假设输出图像为高为 m, 宽为 n 的矩形, 则
同理对 y 进行双线性插值得 :
将输出图像宽确定为 w = m = 200, 输出图像高确定为 h = n = 200, 建立一个空 白图像 A4, 将图像 A1 四个顶点 (x0, y0)、 (x1, y1)、 (x2, y2) 和 (x3, y3) 与空白图像 A4 的四个顶 点对应起来, 利用公式 (1) 和 (2) 可求取图像 A4 在图像 A1 中的对应点, 对于非整数对应点 用双线性插值法插值, 最终求得经过几何畸变校正后的图像 A4。对图像 A4 进行图像均衡, 得到均衡过的图像 A5。 第七步, 划分网格 : 1. 粗划分网格 : 本发明认为打在金属柱面上的二维条码为 8×8, 10×10, 12×12, 14×14, 16×16, 粗划分网18×18, 20×20, 22×22, 24×24 这 9 种划分方式, 简记为集合格如下 :
1) 以水平直线竖直方向遍历图像 A5, 遍历的间隔为一个像素, 遍历的范围为图像 A5 的高度 200 像素。记录每个竖直遍历 j 处水平直线上像素点 pixij 的竖直方向梯度和 :
得到一组竖直方向梯度投影数列同理以竖直直线水平方向遍历图像A5 得到一组水平方向梯度投影数列
2) 选取 p×p ∈ C 划分方式预划分得到一组竖直分割点数列3) 对 于 hq ∈ Hi, 在小 区 间 里, 求取最大加权值 然后将最大加权值处的 hp 重新得到一组微调后新的分割点集合 Hi。 赋值给 hq。对每个分割点都做此操作,
4) 对于 hq ∈ Hi, 求取在区间里竖直方向梯度值投影的峰度 :
其 中,为 标 准 差, 为 4 阶中心矩。然后求取 i×i 划分下竖直方向梯度值投影峰度的平均值 的平均值数列
遍历划分方式集合 C, 得到竖直方向梯度值投影峰度 和竖直分割点数列集合 {Hi}i×i ∈ C。 与步骤5) 然后选取 p×p ∈ C 划分方式预划分水平方向梯度投影数列 并得到一组水平分割点数列集合记为 {Li}i×i ∈ C。2) ~步骤 4) 的算法原理一样, 亦可得到一组水平方向梯度值投影峰度的平均值数列记为
6) 求取峰度最大值假设则p×p 即为二维条码的划分方式, Hp 和 Lp 即为二维条码网格粗划分纵向和横向分割点数列, 最后可以得到二维条码网格粗划分坐标矩阵 :(hi ∈ Hp, li ∈ Lp, i = 1, 2, ..., p-1)
其中第 0 行与第 0 列是扩展的行列, 任取元素 (hi, lj) ∈ G(i > 0, j > 0) 代表第 i 行 j 列网格的右上坐标, w 和 h 代表图像宽度和高度且都等于 200。
2. 微调细化分网格
1) 取 第 i 行 第 j 列 网 格 元 素 (hj, li) ∈ G(i > 0, j > 0),网 格 宽 度 wg = li-li-1,网 格 高 度 hg = hj-hj-1,在 竖 向 harea = {hj-hg/4, hj+hg/4} 范 围 内, 求 取 网 格 (hj, li) 在 harea 范 围 内 的 上 边 缘 梯 度 wupy, 假 设 在 my 处 取 得 最 大 值 :
同 理,在 横 向 warea = {li-wg/4, li+wg/4} 范围内, 求取网格 (hj, li) 的右边缘梯度, 假设在 mx 处取得最大值 :
2) 建立空白二维条码网格边缘梯度矩阵 GE 和二维条码网格划分位移矩阵 GM :
根据上一步求出的第 i 行第 j 列网格的上边缘和右边缘梯度值 wupmy 与 hrigtmx, 将 (wupmy, hrigtmx) 赋值 GE 的第 i 行第 j 列元素。第 i 行与第 j 列网格的上边缘和右边缘 位移为 my-hj 和 mx-li, 将 (my-hj, mx-li) 赋值 GM 的第 i 行与第 j 列元素。遍历 G 循环执行 1, 则得到满秩的 GE 和 GM。最后二维条码网格细划分坐标矩阵为 : G = G-GM。
至此二维条码网格划分已完毕, 划分的精度精确到每个模块, 用矩阵 G 代表划分 的每个模块的坐标, 矩阵 GE 代表划分的每个模块的上和右边缘梯度。
第八步, 迭代提取信息 :
1. 先根据模块坐标矩阵 G 求出每个模块的平均灰度值, 设第 i 行第 j 列网格元素
(hj, li) ∈ G(i > 0, j > 0), 则其灰度平均值为 : 求取 G 中所有元素, 则可以得到二维条码模块灰度平均值矩阵 :循环
对于虚边模块 X = [vp, vp, ..., vp,p, vp-1,p, ..., v2,p, v1,p]2p-1, 建立增广 X 矩阵 1, 2, 其中, 若 i(2 < i < 2p+2) 为奇数, 则xi 代表白模块, 反之代表黑模块。若其中有白模块 xi 的灰度平均值小于其两侧黑模块的灰 度平均值的较大值 xi < max{xi-1, xi+1}, 则重新赋值 xi = (xi-2+xi+2)/2, 即将距离白模块 xi 最近的两个白模块的平均值赋值给 xi ; 若其中有黑模块 xi 的灰度平均值大于其两侧白模块 的灰度平均值的较小值 xi > min{xi-1, xi+1}, 则重新赋值 xi = (xi-2+xi+2)/2, 即将距离黑模块 xi 最近的两个黑模块的平均值赋值给 xi。循环执行, 直到全部白模块比与其相邻的黑模块 平均灰度值要大, 且全部黑模块比与其相邻的白模块平均灰度值要小为止。
2. 建立并初始化二维条码模块信息矩阵 :
其中, 边缘模块为定位模块, 信息已知, 所以将边缘模块赋予初始值, 1 代表白模 块, 0 代表黑模块, 其余的都设为未知信息模块。初始化迭代邻域 n = 1。
3. 判断 (1 代表白模块, 0 代表黑模块, 其余的都设为未知信息模块 )F 中的未知信 息模块是否全部识别出来, 如是转向步骤 7, 否则转向步骤 4。
4. 判断是否, fa, b 的 n 邻域为 :
且 faren 中信息已知白模块个数不为 0 且信息已知黑模块个数也不为 0。若存在 满足此条件的 fi, 转向步骤 5, 否则将 n = n+1 转向步骤 3。 j,
5. 本步是模块灰度平均值判断, 根据矩阵 V 求出 faren 中所有信息已知白模块
的平均值为所有信息已知黑模块的平均值为 则 fi, 若 j=0 ;若则 fa,b = 1 ; 若 则 fa, 若 b=1 ;则 fa, 若以上顺序判断都满足, 则转 b = 0。 向步骤 3, 否则转向步骤 6。
6. 本 步 是 选 择 边 缘 梯 度 信 息 判 断。 假 设 条 件 1 : 若 fa-1,b、 fa+1,b、 fa,b-1 与 fa, 根 据 梯 度 矩 阵 GE 设 fi,j 与 其 中 所 有 白 b+1 中 白 模 块 个 数 不 为 0 或 黑 模 块 个 数 不 为 0, 模块平均梯度值为 或与其中所有黑模块平均梯度值为19假设条件 2 : 若102354363 A CN 102354372说明书10/13 页为信息已知模块, 且 fp-1,q、 fp+1,q、 fp,q-1 与 fp,q+1 中白模块个数不 为 0 且黑模块个数也不为 0, 根据梯度矩阵 GE 求取 fp,q 与其中所有和它信息值相同模块 的平均梯度值 和其中所有和它信息值不同模块的平均梯度值 平均值 平均值 然后求取满足假 设条件 2 的所有 fp,q ∈ faren 的 若假设 1 和假设 2 都成 则 fa,b = 1, 反 则 fa,b立: 假如假设条件 1 中的白模块数不为 0, 若 之 fa,b = 0 ; 假如假设条件 1 中的黑模块数不为 0, 若 则 fa, 否则 fa, b = 1, b = 0。转向步骤 3。= 0, 反之 fa,b = 1 ; 若假设条件 1 或假设条件 2 不成立, 则回归到模块灰度平均值判断, 若 7. 将全部信息识别出, 得到二维条码模块信息矩阵 F。
本发明的有益效果是 : 本发明能对任意角度旋转倾斜, 轻度或中度几何畸变, 轻度 或中度光照不均, 对比度不强, 轻度或中度磨损的金属上的二维条码都有较高的识别率。 识 别出来的小模块的正确率一般都在 80%以上, 质量比较好的图像能达到 95%及更高。识别 时间在 268 毫秒左右。
本发明的能解决金属柱面上直接标刻的 DataMatrix 二维条码图像由于柱面光滑 及大曲率所造成表面反光严重、 光照不均、 码区形变严重、 信息损失及对比度低等问题, 读 取正确率一般可以达到 95%以上。对于 640*512 输入图像, “单幅识别” 程序运行时间在 200 ~ 300 毫秒之间, “融合识别” 程序运行时间在 500 ~ 600 毫秒之间。
下面结合附图和实施例对本发明进一步说明。附图说明
图 1 是高反光柱面金属上二维条码图像识别方案总过程 ; 图 2 是识读工装整体结构 ; 图 3 是去噪示意图 ; 图 4 是遍历霍夫变换域模板 ; 图 5 是仿射变换示意图 ; 图 6 是遍历求取梯度波形图示意图 ; 图 7 是梯度值波形图 ; 图 8 是实例一所处理图像 ; 图 9 是实例一处理总过程 ; 图 10 是实例二所处理图像 ; 图 11 是实例二融合过程。具体实施方式
本专利对处于高反光, 大曲率柱面金属背景下的二维条码图像提出一套独特的处 理方法。借助于特定的二维条码识读工装及简便光源, 采集柱面金属上包含二维条码的图 像。对于金属柱面背景下所特有的光照不均及高反光, 本专利通过采集条码区域上下方的 光滑区域像素, 采用数学函数模型拟合光照, 逆向校正图像光照分布 ; 对于大曲率柱面及反 光带遮盖条码区域所造成的信息损失情况, 采用缩小条码采集区域并旋转采集多幅图像进行融合, 拼接成信息无损和微形变的二维条码。 对于二维条码边界定位, 本专利通过先判断 图像整体边缘方向, 然后根据整体边缘方向而缩小了霍夫变换区域, 大大减小程序运行时 间并有一定的抗噪性能, 然后根据改进的强鲁棒性霍夫变换和最小二乘法精确确定边缘 ; 在二维条码网格划分上, 由于柱面形变及光的衍射等因素, 造成二维条码各模块大小并不 一致, 本专利通过一次粗划分, 一次微调, 准确定位二维条码的每一个模块 ; 对于二维条码 每个模块的数据识别, 本专利采用邻域灰度值对比与边缘梯度对比双参数进行迭代识别, 对于光照不均和对比度较低的二维条码图像有着较高的鲁棒性。
实例一 : 单幅识别
如图 8 所示, 本实例选取直径为 Φ12 的柱面金属, 在识读工装下用 MV1300 拍摄其 上的二维条码图像。识读工装示意图如图 2 所示。本实例选取快门速度 7ms, 增益调节 58, 图像大小为 640*512pix, 采集速度为高速, 反光带没有覆盖二维条码信息。为实现上述目 的, 本发明的技术方案总过程如图 1 所示。
1. 在识读工装下, 拍摄的二维条码图像如图 8 所示。首先根据二维条码区域有两 条白边作为定位边, 确定横向方向上二维条码的位置 : xlef = 182, xrigt = 429。然后根 据条码边缘的复杂性, 通过投影法确定纵向二维条码所在区域, 利用第一步算法得到 ydown = 109, yup = 320, 初定位区域如图 9(b) 中黑色线内的区域所示。
2. 由于图像竖向像素属于柱面的同一弧度, 在两侧平行的条状白光源下, 对于柱 面产生的光照不均在竖向是均匀的。横向则是由两侧向中间渐变变小的曲线。经过大量实 验, 发现由 6 次多项式插值的函数能够很好的模拟横向像素的渐变曲线。利用第二步中的 校正柱面光照不均算法, 拟合出 6 次多项式方程为 y = 2E-10x6-1E-07x5+3E-05x4-0.0048x3 +0.3697x2-14.225x+253.91, 拟合误差为 R2 = 0.9851。逆向校正并裁切后的图像如图 9 中 (c) 所示, 裁切后的新图像 h = 227, w = 240。
3. 由于定位二维条码边界时最重要的是边缘信息, 本专利首先对裁切后的图像 做灰值形态学边缘梯度运算, 以半径为 2 个像素的圆形结构元素对边缘梯度进行形态学 开运算去除细小污染。然后利用第三步中的算法建立原图像灰值边缘方向数组, 并得到 两 条 主 方 向 分 别 为 dfirst = 1.52020688 和 dsec = -0.028376115, 由 于 图 像 中 以 dfirst 和 dsec 为方向的四条直线 ( 为 dfirst 方向的有两条直线, 为 dsec 方向的两条直线 ) 从四个顶 点开始遍历, 去除二维条码区域外噪声并粗定位到二维条码区域, 去噪示意图如图 3 所 示。最后得到去噪粗定位后的图像, 如图 9(d) 所示。在粗定位后, 下面的就要通过加邻 域模板的霍夫变换精确确定二维条码边缘及其四个顶点, 先是分别从上向下, 从下向上, 从左向右, 从右向左扫描图 9(d) 得到一组边缘点, 效果如图 9(e) 所示。以极半径 ρ 取 值范围 极角 θ 取值范围 和对 “边缘点” 图像做霍夫变换得到一个霍夫变换域, 然后利用 5.3 中的模板遍历霍夫变换域法和最小二乘拟合法精确定位二维条码的四条边缘, 如图 9 中 (f) 所示。并得到二维条码的四个顶点, 左上顶点 (42, 199), 左下顶点 (38, 29), 右上顶 点 (211, 195) 和右下顶点 (207, 27)。
4. 将四个顶点代入第四步中的校验函数, 满足条件, 继续向下执行。5. 新建一幅 200*200 的空白图像, 将 3 中求取的左上、 左下、 右上和右下顶点分别 对应空白图像的左上、 左下、 右上和右下顶点, 利用第六步中的仿射变换算法, 求得校正后 无畸变正方形二维条码图像, 如图 9 中 (g) 所示。由于仿射变换采用了双线性插值法, 所以 变换后图像质量会有所下降, 整体对比度降低。本专利在对原图像仿射变换后再进行图像 均衡, 增加对比度。效果如图 9 中 (h) 所示。
6. 根据第 7 步中的梯度投影算法求取出二维条码的横向和纵向梯度投影, 如图 9 中 (i) 所示。然后分别求取 8×8 ~ 24×24 这 9 种划分方式在 “梯度投影波形” 中的峰度 值, 以最大值为基准归一化, 得到峰度值如下表格所示 :
行数方式 峰度值 8×8 0.48 10×10 0.56 12×12 0.50 14×14 1 16×16 0.43 18×18 0.39 20×20 0.49 22×22 0.41 24×24 0.43可知 14×14 是二维条码的最佳划分方式, 并将其粗划分效果如图 9 中 (j) 所示。 在二维条码网格粗划分后, 由于柱面弧度、 光的衍射等因素, 造成图像中二维条码的每个模 块大小并不一定等大, 本专利又对粗划分完的二维条码网格进行微调, 而得到精确定位二 维条码模块的网格矩阵, 然后再根据网格之间的梯度微调, 得到更加精确的定位每个模块 的大小, 效果如图 9 中 (k) 所示。
7. 本发明提出一种新的基于邻域灰度对比和边缘梯度对比的迭代提取二维条码 模块信息的方法, 这是一种非基于二值化图像而是基于灰度图像的方法, 所以是一种信息 无损算法, 并能有效的应对光照不均。 本算法原理是 : 每个二维条码模块的识别结果是通过 与它最近邻域的已识别的二维条码模块对比得出的。首先利用 5.8 算法求取精确定位的每 个模块的平均灰度值, 建立二维条码模块灰度平均值矩阵, 效果如图 9 中 (1) 所示。然后利 用相邻模块灰度平均值及边缘梯度双参数对比, 迭代求出每个未知模块的信息值, 最终读 取效果如图 9 中 (h) 所示所示。
通过本算法提取的信息效果如下表格所示 :
错误个数 0
错误坐标 无 正确率 100% 计算时间 268 毫秒实例二 : 融合识别
如图 10 所示, 本实例选取直径为 Φ6 的柱面金属, 并拍摄其上的二维条码图像。 由于柱面半径较小, 曲率过大, 无论如何调节相机参数都无法消除反光带覆盖掉部分二 维条码信息, 所以应采取融合识别。本实例选取快门速度 7us, 增益调节 58, 图像大小为 640*512pix, 采集速度为高速。
1. 调节黑色金属挡板使夹缝适当变小, 同时观察右侧视频显示框中所显示的图 像, 直至将高反光区域去掉为止。然后本实例选取 2 秒读取 4 幅图像, 读取的图像如图 11 中 (a) 所示。
2. 如 5.5 中算法所示, 将这四幅图像首先进行初定位, 并根据初定为结果切割处二维条码区域, 效果如图 11 中 (b) 所示。利用 5.5 中所述算法, 然后对每幅图像进行角点 提取, 提取结果如图 11 中 (c) 所示。
3. 建立位移矩阵, 计算每相邻两幅图像的角点区域互相关系数, 根据最大互相关 系数位移点融合相邻两幅图像, 四幅图像的融合结果如图 11 中 (d) 所示。
4. 后续算法和实例一类似, 这里就不累述。