iOS开发iOS程序猿iOS开发记录

iOS OpenCV 身份证静态识别浅谈

2018-03-13  本文已影响276人  随行的羊

成果展示:


身份证识别

一、可以发现,轮廓检测时间小于0.4秒,有人说我使用的是iPhone模拟器看不出性能,但如果你知道我用的电脑性能不高的话,应该会觉得这个时间可以了,而且如果运行在真机上,速度还会更快些。

二、你可能也发现了,原图基本都会有一些倾斜角,而经过我的处理之后,图像都被矫正拉直了。

想想就激动,不是吗?

进入正题

因为项目的需要,需要研究图片识别。图片识别大体上分为两个部分:一个是选取所要识别的正确轮廓,一个是对正确轮廓进行文字识别。
那么无论是哪些方面都需要比较多的步骤,这里我将重点介绍一下第一部分,就是如何选取所要识别的正确轮廓。

所采用的环境:Xcode 9.2
图片处理库:OpenCV 3.2.0
文字识别库:TesseractOCRiOS 4.0.0

当然你可以使用Pods直接集成没什么问题,那么开始介绍,以下是进行图片处理的步骤:

1、图片的基本概念
图片的基本概念是基础,比如你需要了解:二维图片包含行和列,行的总数等于图片的高,列的总数等于图片的宽。每个点为一个坐标,包含x和y,每个点是一个像素,每个像素包含4个通道,每个通道是8位无符号。png包含4个通道,jpeg包含3个通道,你需要了解什么是通道,为什么有的只有1个通道,有的有3个,有的则是4个。当你知道任何图片由宽高组成的时候,处理图片是否可以通过双重循环来处理?虽然效率很差,但至少是一种解决方案。

2、尺寸调整函数
尺寸调整函数是一个非常优秀的函数,你需要了解它的参数,各个参数代表什么作用,提供了多少种插值方式,而你为什么选定了那一种。当然尺寸调整函数的重大意义在于,当一个图片很大时,通过缩小图片,达到减少大量运算的目的,其效果是相当优秀的。所以调整好尺寸和插值方式是相当重要的部分。

3、高斯模糊函数
高斯模糊函数可以有效地减少图片噪点,你可能需要了解,为啥使用的是高斯模糊函数而不是别的模糊函数?即便是选择了高斯模糊函数,卷积核大小的选择也是重点,毕竟太模糊了或者不够模糊都会影响图片识别。你可能需要复习一下标准差σ。

4、通道拆分复制函数
通道拆分复制函数,通过拆分通道的方法来实现单通道,很多文章介绍说使用灰度图的方式,这时候你就要思考我为什么使用通道拆分复制函数,而不使用灰度图。即便是知道了使用单通道拆分,那么要拆分哪个通道呢?这也是需要思考的。相信勤奋好学的你,很快就能知道答案了。

5、边缘检测函数
通过了尺寸调整、高斯模糊、通道拆分之后,相信图片已经变得泾渭分明了,然后只需要加入边缘检测函数,相信就可以检测出满意的边缘了。你需要了解2个阈值的作用以及其他参数。如果你有心想进一步了解算法,你可以需要复习一下,极限、积分、微商、偏导、梯度等专业的数学名词。

6、膨胀函数
边缘检测函数用了之后,你需要使用膨胀函数让边缘变得更完美。膨胀函数可以有效地去除刚刚通过边缘检测出来的边缘区域之间潜在的眼孔。参数比较多,你需要好好了解,特别是内核与边缘类型。如果你有心,你可能还可以了解一下腐蚀,因为它是膨胀的好基友,两个是相反的运算。

7、轮廓检测函数
通过刚才的一顿操作,边缘已经变得相当完美,这时,你调用轮廓检测函数,基本上就能搞定身份证的轮廓了。参数中的mode与method,你需要重点了解一下。论文中对于轮廓检测有相当多的定义,还有边界跟踪算法,如果可以,你也需要了解一下。

8、多边形拟合函数
到这里,通过多边形拟合函数才真正意义上的确定了身份证的正确轮廓,它的算法是如此的有趣,如果你有兴趣,可以了解一下实现过程,以及参数ε所代表的意义,因为这个值的选择,对识别很重要。由多边形拟合函数引申到2个重要的内容:寻找凸包和旋转卡壳算法,这个两个函数结合是用于寻找凸四边形中最远的两个点。

9、面积函数
面积函数可以剔除小的不满足的图形,或者通过面积函数得到众多图形中轮廓最大的图像。

10、凸四边形判断函数
凸四边形判断函数用于判断拍出来的身份证轮廓是不是凸四边形。它的判断算法挺多的,有角度法、凸包法、顶点凹凸性法等等。

那么总结下来,我们需要:
1、图片的基本概念
2、尺寸调整函数
3、高斯模糊函数
4、通道拆分复制函数
5、边缘检测函数
6、膨胀函数
7、轮廓检测函数
8、多边形拟合函数
9、面积函数
10、凸四边形判断函数

你通过这10个步骤下来,已经可以处理70%以上的身份证图片。

其他需要处理的问题还有很多,就不继续详细介绍了,但是可以给出思路,比如:
1、你需要进行倾斜角矫正。
2、你需要取出身份证进行精准识别。

如果你完美地解决了以上两个问题,那么你可能需要继续解决以下问题,比如:
1、图片有较大的明暗变化时,应该如何处理?
2、如果进行更准确地文字识别?
3、如何缩小识别时间?

如果你完美地解决了以上问题,那么你可能需要继续解决以下问题,比如:
1、静态识别算是比较容易的,如果换成动态识别,需要注意什么?
2、无论是OpenCV库或者TesseractOCRiOS库,他们的容量都太大了,怎么缩小?

当你解决了以上问题时,就完成了一个完美的身份证动态识别。
有些问题要自己动手尝试,衣来伸手饭来张口而没有思考,将不会使你更上一层楼。

-------------------------------我是分割线-------------------------------

2018-03-13

上一篇下一篇

猜你喜欢

热点阅读