opencv_app/project/Scanner/readme.md
OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件
相信很多人手机里都装了个“扫描全能王”APP,平时可以用它来可以扫描一些证件、文本,确实很好用,第一次用的时候确实感觉功能很强大啊算法很牛逼啊。但是仔细一想,其实这些实现起来也是很简单的,我想了下,实现的步骤应该就只有下面三个:
将证件轮廓找到
提取证件矩形轮廓四点进行透视变换
二值化
知道原理之后,我马上利用强大的opencv开发一个类似“全能扫描王”扫描工具。
整理一下我们要制作的这个扫描工具有哪些功能:
图像的信息区域的提取与矫正
图像的二值化
锐化和增强
第二第三点都非常简单,那么制作这个工具的难点完全落在了第一点“ 图像的信息区域的提取与矫正”上了。在编码实现的过程中,确实有很多坑需要踩一踩。
对于图像矫正的问题,在图像处理领域还真得多,比如人民币的矫正、文本的矫正、车牌的矫正、身份证矫正等等。这些都是因为拍摄者总不可能100%正确地拍摄好图片,这就要求我们通过后期的图像处理技术将图片还原好,才能进一步做后面的处理,比如数字分割啊数字识别啊,不然歪歪扭扭的文字数字,想识别出来估计就很难了。
上面几个图,我们在日常生活中遇到的可不少,因为拍摄时拍的不好,导致拍出来的图片歪歪扭扭的,很不自然,那么我们能不能把这些图片尽可能地矫正过来呢?
OpenCV告诉我们,没问题!工具我给你,算法你自己设计!
比如图一,我要想将人民币矫正,并且把人民币整个抠出来保存,该怎么做?那就涉及到了图像的矫正和感兴趣区域提取两大技术了。
总的来说,要进行进行图像矫正,至少有以下几项知识储备:
轮廓提取技术
霍夫变换知识
ROI感兴趣区域知识
没错,我们就抓住人民币的的边缘比较明显来做文章!我们是不是可以先把人民币的轮廓找出来(找出来的轮廓当然就是一个大大的矩形),然后用矩形去包围它,得到他的旋转角度,然后根据得到的角度进行旋转,那样不就可以实现矫正了吗!
再详细地总结处理步骤:
图片灰度化
阈值二值化
检测轮廓
寻找轮廓的包围矩阵,并且获取角度
根据角度进行旋转矫正
对旋转后的图像进行轮廓提取
对轮廓内的图像区域抠出来,成为一张独立图像
人民币图像和发票图像他们有明显的的边界轮廓,而文本图像没有。文本图像的背景是白色的,所以我们没有办法像人民币发票那类有明显边界的矩形物体那样,提取出轮廓并旋转矫正。
经过深入分析可以看出,虽然文本类图像没有明显的边缘轮廓,但是他们有一个很重要的特征,那就是每一行文字都是呈现一条直线形状,而且这些直线都是平行的!
对于这种情况,我想到了另一种方法:基于直线探测的矫正算法。
首先介绍一下我的算法思路:
用霍夫线变换探测出图像中的所有直线
计算出每条直线的倾斜角,求他们的平均值
根据倾斜角旋转矫正
最后根据文本尺寸裁剪图片
最后总结一下两个算法的应用场景:
基于轮廓提取的矫正算法更适用于车牌、身份证、人民币、书本、发票一类矩形形状而且边界明显的物体矫正。
基于直线探测的矫正算法更适用于文本类的矫正。