基于OpenCV实现文档物体的纠偏方法
2016-11-14王咸锋黄妙燕
王咸锋 黄妙燕
摘要:由于高拍仪设备自身拍摄的特点,以及被拍摄物体摆放不当等原因,所拍摄的图像边缘经常会出现偏斜。该文提供的方法是先从视频流中实时取到图像;然后对图像进行去噪点;再把图像进行二值化;利用Hough变换找到直线,计算直线的角度,直线的角度就是图需要旋转的角度;对四条直线方程进行规整,输出四条直线围成的矩形;最后将矩形实时的显示在视频上,并在视频上通过画方框的方式将结果显示出来,矩形显示成功表示纠偏成功,有效保证用户一次拍图就能够获取自己想要的图像。
关键词:摄像头;可视化;纠偏;二值化;OpenCV
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)24-0087-03
1 背景
目前常见的电脑周边办公设备如高拍仪,是一种视频输入设备,被广泛地运用于办公扫描,教育、展示等方面。通过高拍仪获取的文档影像进行处理日益成为人们研究的热点。在银行、电信、公安、公积金、财税、证券等行业, 票据及证件的电子影像系统已经出现,这些系统通常以票据及证件的拍摄图像作为输入。在拍摄输入的过程中, 由于摆放不当、纸张折叠及其他各种因素, 拍摄得到的图像总是偏斜,在具体应用中,将文档纠正,然后用去黑边算法去掉周围的黑边。高拍仪作为一种新型扫描设备,已经跻身扫描市场,但是通过高拍仪扫描的图像噪点较多、亮度不均匀,使得基于传统扫描仪的纠偏算法失效;同时,由于高拍仪是开放环境、光线变化很大,文档放置很随意,所以不能百分百保证纠偏成功,给用户带来很大困惑。
为了解决以上问题,本文提供一种在高拍仪的可视化下基于OpenCV纠偏的方法,有效保证用户一次拍图就能够获取自己想要的图像,同时给用户一种新的用户体验。
2 概述
在一个高拍仪处理系统中,获得实时图像后,一般要进行预处理。在公安、电信、公积金等行业的票据及证件电子影像系统、汽车牌照的抓拍识别系统以及OCR识别等系统中,通过高拍仪输入设备获得的图像由于摆放等原因,物体会产生一定的斜角,斜角会给图像处理与分析时带来更大的难度,使处理变慢,用户体验差,因此,纠正斜角是图像预处理的重要工作。
纠偏校正的核心在于如何检测出图像的偏角。目前,纠偏角度的检测方法有许多种,主要可分为5 类:Hough变换法,交叉相关性方法,投影法,Fourier变换法和最近邻簇法。
Hough变换法是最简单常用的检测偏角方法,但是Hough算法计算量大,因此一些专门用于纠偏角检测的Hough变换改进算法被提出来,虽然这些算法的核心思想是减少Hough变换的计算量,但算法的速度仍较慢;交叉相关性法矩阵的计算量较大,体验差,不适合用于办公等日常应用,但准确率高;投影法利用投影的某些特征进行判断,需要对整个图像统计特征值,因此计算量和复杂度都较高;Fourier法是将文档图像的所有像素点进行Fourier变换,计算量更大,目前已被弃用;最近邻簇(KNN) 法算法太过复杂,且运行速度慢,计算量大。本文使用的是基于OpenCV库的Hough算法。
3 OpenCV简介
OpenCV是Intel开源的计算机视觉库(open source computer vision library)的简称,目前已经发展成为图像预处理的标准,适用于不同的操作系统和平台,包括移动平台等,如安卓等等。OpenCV库由C函数和C++函数构成,实现了在图像处理以及计算机视觉方面的许多通用算法,主要对图像进行如运动检测、跟踪、分割、识别以及3D重建等高级处理。OpenCV库有300多个跨平台的中、高层API(C函数),C函数不依赖外部库,但可以使用外部库。由于OpenCV库是开放源码且代码简洁高效,其中大多数函数都经过汇编最优化,所以能充分利用英特尔系列的芯片的设计体系,因而对于英特尔系列芯片,OpenCV库的代码执行效率是非常高的。OpenCV库具有快速的图像运算能力和强大的矩阵运算能力,并且具有详细、简洁的图像和矩阵用户接口。OpenCV已发布了多个版本,最新的版本支持主流的操作系统,包括PC端和移动端的操作系统,为开发者提供了开发便利,大大提升了开发效率,并且图像算法稳定可靠。本文程序运行环境为:Windows+VS2012+OpenCV 2.0+DirectShow9.0。
4 核心算法流程
本方法可以实时运行纠偏算法,并在高拍仪视频上通过画方框的方式将结果显示出来。具体地,先从视频流中实时取到图像;然后对图像进行去噪点;再把图像进行二值化;利用Hough变换找到直线,计算直线的角度,直线的角度就是图需要旋转的角度;对四条直线方程进行规整,输出四条直线围成的矩形;最后将矩形实时的显示在视频上。
4.1 从摄像头中实时获取图像
实时显示是本方法的一个重要特色,为了做到实时显示,我们对高拍仪所传输的每一帧图像都进行处理,同时保证处理时间在20ms以内,这样就可以保证实时计算,实时框选,当用户移动纸张,或者扫描文档有变化的时候,会及时跟踪并框选当前文档,让视频跟画框同步。实时显示让用户扫描起来更便利,更快捷。
把图像读进内存,由于处理的是文本、表格等文档,彩色信息在处理过程中并没有作用,所以把内存中的图像进行二值化处理,以灰度形式显示。读取的图像如下:
为了能更好地模拟旋转效果,在放置拍照文档时随意倾斜一定的角度,以便给后面处理。
4.2 去噪点——对图像进行平滑处理
在对图像进行平滑处理时,需要注意的是在用窗口扫描图像过程中,对于图像四个边缘的像素点可以不处理,也可以使用灰度值为0的像素点扩展图像的边缘。为了使编程工作简单,可以预先定义一个的模板数组。对于小的卷积核(从3x3到7x7),使用上述计算标准sigma的公式速度会更快。本文使用OpenCV的cvSmooth函数来平滑图像,为图像的二值化做好准备。
4.3 图像二值化
二值化之前,为了提高处理速度,首先对图像进行缩放,这样就能保证图像处理的实时显示。
设定一个阈值T是图像二值化最常用的方法,用阈值T将图像的数据分成两部分:简单地说就是将整个图像呈现出只有黑和白的视觉效果,大于T的像素群是黑的,小于T的像素群是白的,将图像上的像素点的灰度值设置为0或255。 但是此方法确定的阀值得到的二值化在光线变化和亮度不均匀的时候效果很差,不能商用。本文使用迭代法求阈值:预先设置一个经过学习的阈值T,对图像中灰度值>T的像素点求出灰度平均值T1,图像中灰度值 本文中的二值化使用OpenCV的cvThreshold函数,该函数的典型应用是对灰度图像进行阈值操作得到二值图像,函数中的阀值使用上面迭代法求得。 4.4 利用Hough变换找到直线 为了准确找到直线,我们首先采用Canny算法寻找输入图像的边缘,并在输出图像中标志这些边缘,Canny算法的核心包括以下几个步骤: 1)用高斯滤波器平滑图像。 2)用一阶偏导的有限差分计算梯度的幅值和方向。 3)对梯度幅值进行非极大值抑制。 4)用双阀值算法检测和连接边缘。 5)采用高斯平滑函数。 本文中的找边和找直线使用OpenCV库的cvCanny函数和cvHoughLines2函数。依次遍历找到的直线,计算找到直线的角度,判断是否已找完所有直线,如已找完,计算需要旋转的角度,如图4所示,操作流程如下: 当所拍摄物体倾角大于 45°时,进行纠偏旋转有两种情况选择,逆时针旋转使物体竖起来,或顺时针旋转使物体横向放置。为简化操作和提升效率,算法中增加偏角限制为 45°,即在Hough变换中找到的直线角度大于 45°时,不进行直线的统计与运算,只运算 1/4 的角度,可提升4倍的运算效率。 通过Canny算法找边和对边进行Hough变换,会得到四条直线,通过四条直线构建一个四边形,在界面上显示出来构建的矩形,如果能在界面上显示出来构建的矩形,则认为纠偏成功,如果不能在界面上显示出来构建的矩形,就认为纠偏失败。 5 结束语 采用本文所述的方案能够实现高拍仪可视化下稳定的纠偏,这使得高拍仪相对于普通拍摄仪的一个优点在于可视化,可实时显示拍摄的内容,纠偏结果可视化,带来了非常友好的用户体验,让用户知道将要扫描的文档是否可以正常完成纠偏操作,告知用户将要纠偏哪些内容,真正做到所见即所得,保证用户一次拍图就能够获取自己想要的图像,将高拍仪可视化的优点提到一个新的高度,同时给用户一种新的用户体验。纠偏的效果如下图所示: 参考文献: [1] 刘瑞祯, 于仕琪. OpenCV 教程[M]. 北京: 北京航空航天大学出版社, 2009. [2] 左飞, 万晋森, 刘航. Visual C++ 数字图像处理开发入门与编程实践[M]. 北京: 电子工业出版社, 2008. [3] 江超, 艾矫燕. 基于OpenCV的摄像头动态手势轨迹识别及其应用[J]. 计算机应用, 2012(1): 129-133. [4] 贾小军, 喻擎苍. 基于开源计算机视觉库OpenCV的图像处理[J]. 计算机应用与软件, 2008(4): 276-278.