形状识别中常见的即是矩形框的识别,识别的主要步骤通常是:图像二值化,查找轮廓,四边形轮廓筛选等。当识别的目标矩形有一条边被部分遮挡,如图1所示,传统的识别方法就不能达到识别的目的。
图1
在这里,提供一种识别的思路,仅供参考。识别的最终目标就是想识别出身份证的四条边,通过计算四条边的交点最后得到四边形的轮廓。主要涉及的问题有如下几点:
常规直线检测方法即是Hough。这里推荐使用一种比较新的直线检测算法LSD。
算法的具体使用请参考网站提供的源码。
图2和图3分别是Hough直线检测与LSD直线检测的结果示意图。
对于LSD算法得到的结果,可以根据直线的长度进行初步的筛选,得到更好的检测结果,提高后期处理效率。如图4所示。
图2
图3
图4
由图4可以看出,身份证的每条边缘被分割成几段短线段,这里给出将每条边上的短线段聚为一类的方法。 在极坐标系下的一点即定义一条直线,其中表示极坐标原点到直线的距离,为如图所示夹角。如图5。
图5
此时不难看出,身份证同一边上的线段应该具有相近的极坐标点。
具体做法是,先选取极坐标系的原点O为图像的重点(w/2,h/2)。建立笛卡尔坐标系;其中是图像坐标系。极坐标系与笛卡尔坐标系的转换关系为。因此,当已知一线段的两个端点,即可求解出对应的。具体角度的计算请参考直线检测之极坐标表示。
代码如下:
将图4中检测到的所有直线线段利用极坐标表示,然后进行分类,同类的直线分配相同的标签号。然后对相同标签号的线段对应的极坐标进行加权平均,即为对应直线。 算法如下:
由于身份证边缘长度是大于一定阈值的,此时,如果同类线段的长度和小于某阈值,则可以剔除掉该线段。 如图6红色线段为LSD检测结果,红色直线为线段对应极坐标表示的直线。
图6
由图6可以看出,图中不仅有身份证边缘的直线,同样存在其他干扰直线,并且背景环境越复杂,干扰的直线会越多。此时就需要对直线进行筛选。这里进行筛选的思路是,采集图6中所示红色线段两侧的图像数据,计算颜色特征H,S,V。针对图6,手上的颜色特征明显区别于身份证边缘的特征,很容易去除。数据获取如图7所示,图中红色和蓝色区域即是对应线段的采集样本区域。
图7
具体代码如下,输入是一条线段,输出是布尔类型,表示该线段是否符合要求。
由于待测身份证的边缘邻域颜色特征是稳定的,可以作为初始经验值,当识别线段的颜色特征不符合经验值要求即可剔除掉,最后得到想要的边缘线段以及对应的极坐标表示直线。然而,有时候可能得到满足条件的直线比较多,此时可以考虑为每一类直线进行评分,然后根据得分排序,取出前4条得分最高的直线,大部分情况下都是所求边缘直线。具体情况可具体对待,此处不再展开。
这里给出极坐标系下直线的求交点方法,这里主要注意两点:首先,两条直线不是平行的,其次,直线的交点在图像范围内。
得到四个交点,此时点的顺序可能是错乱的,需要对点进行排序,起点选择为左上角的点,并按逆时针方向对点排序。方法如下:
最后,检测结果如图8所示。
图8