利用OpenCV实现在Android系统下的文档去黑边

2016-12-06 12:54王咸锋
电脑与电信 2016年8期
关键词:调用文档摄像头

王咸锋

(广东建设职业技术学院建筑信息系,广东 广州 510440)

利用OpenCV实现在Android系统下的文档去黑边

王咸锋

(广东建设职业技术学院建筑信息系,广东 广州 510440)

本文提出一种基于开源计算机视觉库OpenCV实现Android系统下文档去黑边的方法。介绍了如何在Android中使用OpenCV,详细阐述了利用JNI调用OpenCV相关函数的具体步骤,即在调用摄像头时,所要考虑的内容,以及采用Android NDK生成共享库的关键过程。实验结果表明,此Android应用程序对不同场景下不同种类的文档进行实时去黑边的功能性能良好。

可视化;去黑边;OpenCV;系统设计

1 引言

对于商务人士来说,尤其是在出差途中,如果遇到急需用扫描仪扫描合同、文件、发票、税单、机票或需要发传真、邮件共享扫描文件时,这时只需拿出带有摄像头的智能移动设备拍摄即可。但是在拍摄的过程中,由于摆放不当、纸张折叠或其他各种因素,拍摄得到的图像总是有多余的边框或黑边,给后期图像分割、字符识别等带来了极大的不便,严重影响工作效率,所以需要一款能有效解决以上问题的Android应用程序。Android应用程序是通过Android SDK(Software Development Kit)利用Java编程语言进行开发,每一个Android应用程序都运行在自己独立的Dalvik虚拟机上,而此虚拟机支持JNI,同时伴随着Android NDK的发布,使开发者利用第三方C/C++库协助编写Android程序成为可能,为在Android系统下利用OpenCV编写计算机视觉相关应用程序的软件开发人员提供了便利。

2 开发环境搭建

近年来OpenCV发展迅猛,随着Android智能终端的发展,越来越多的传统科研平台都转向Android移动终端。2010年6月发布的OpenCV 2.3、2.3.1版本,除提供C++接口向下兼容C接口外,还新增了Java接口,且是对准Android平台。更重要的是以前官方不支持ndk-build,这次终于一统JNI接口调用方式,方便在Android上开发使用。2012年4月2日发布了2.4版本,支持windows/Linux、Mac/Android/IOS四大系统。自2.4版本发布之后,为了和Android的系统架构保持同步,准确来说是吸收Android框架层的优点,引入了OpenCV Manager的概念,其本质就是一个Service,用来管理OpenCV动态链接库。它工作在APP和OpenCV的动态链接库之间。OpenCV Manager的结构就是模仿Android的Binder机制。其架构图如下:

图1 OpenCV Manager架构图

APP在运行时会首先检查OpenCV Manager是否存在,如果不存在则会提示安装。如果存在,就会连接这个服务,进一步初始化加载OpenCV库。

本文的开发环境为:windows+ADT Bundle+CDT+ OpenCV-2.4.4-android-sdk。将OpenCV-2.4.4-android-sdk解压后,会看到如下文件夹:

图2 OpenCV-2.4.4-android-sdk解压后的文件夹

其中sdk就是开发时要用到的数据包,samples是自带的示例,doc是说明文档,apk则是OpenCV Manager。手机想要运行基于OpenCV的Java接口的程序,就必须先安装OpenCV Manager。

2.1 AndroidAPP通过Java接口调用OpenCV

2.1.1 配置

配置比较简单,但为了保持同步,使以后在开发中可以随意调用Java接口和JNI接口,我们仍将压缩包解压到跟工作空间平级的目录。再将解压后的sdk文件夹命名为OpenCV4Android-sdk,拷贝到新建的工作空间中。

图3 配置时放置文件夹位置

让这两个文件夹平级是为了以后JNI调用时无需修改mk文件。注意解压后会嵌套一个目录,把它拷贝到最外层。而sdk文件夹命名和拷贝到新的工作空间则不是必须的。

打开Eclipse切换到刚创建的工作空间,右键import→General→Existing Projects into workspaces。选择OpenCV解压后的sdk数据包,导入后看是否有错误,如果提示找不到java.util.List数据包,那是因为没有加载Android的SDK进来。选中项目,按快捷键Alter+Enter,单击Android,选中一个SDK(要求3.0以上),单击clean,看bin文件夹下的opencv library-2.4.4.jar是否生成,如果生成了就表示已经导入成功。

2.1.2 新建项目并引入上面的jar包

任意新建一个Android Application Project,然后选中该项目快捷键Alter+Enter,在下面的加库区域点Add,将导入工作空间的opencv sdk选中:

图4 新建项目并引入jar包

可以看到在Android Dependencies中将刚导到bin目录下生成的jar文件导进去了,之后就可以使用opencv的API了。

3 实现过程

3.1 传统去黑边方法比较研究

目前针对Android的去黑边应用较少,并且大都未能达到实时可视化,较常用的扫描仪去黑边方法有两种,一是将黑边从扫描图像中裁减掉,图像的大小将会缩小到与原文档相同的实际大小;二是用白色填充黑色边缘,图像的尺寸将保持不变。由于图像黑边一般比图像内容灰度大,所以要先对灰度图像使用开运算得到只有黑边的图像,再利用图像的减法运算将黑边去除,最终达到去除黑边的目的,缺点是对

环境要求高,特别是光线,当高拍仪拍摄的图像噪点较多、亮度不均匀,使得基于传统扫描仪的去黑边算法失效;同时,由于高拍仪是开放环境、光线变化很大,文档放置很随意,所以不能百分百保证去黑边成功。

笔者在对几种常用去黑边方案可行性和有效性论证的基础上,经过大量实验得出了一种在Android系统基于OpenCV去黑边算法,不但可以实时精准地对任意倾斜角度的文档物体进行捕捉并去除黑边,还可以解决传统去黑边方法对环境要求高、对移动的物体捕捉失效的情况。

3.2 总体设计思路

本文采用的去黑边算法是先从视频流中实时获取图像;然后对图像进行去噪点;再进行二值化;按照预设步长和可忍耐边界值获取图像的边界点;再对四条直线方程进行规整,输出四条直线围成的矩形;最后将矩形实时的显示在视频上。流程示意图如图5所示。

图5 算法流程示意图

3.3 核心算法流程

首先,图像平滑处理,即去噪点。图像平滑包括空域法和频域法两大类。在基于空域法的图像平滑中,常用的方法是均值滤波或中值滤波。在编程过程中,定义一个n×n的模板数组;在窗口扫描图像过程中,可直接使用灰度值为0的像素点扩展图像的四个边缘。对于小的卷积核(从3×3到7×7),使用上述计算标准sigma的公式速度会更快。本文采用OpenCV的cvSmooth函数来平滑图像。

其次,图像二值化。为了提高处理速度,首先对图像进行缩放的预处理,以保证图像处理实时显示。图像的二值化最常用的方法就是设定阈值T,传统方法得到的二值化在光线变化和亮度不均匀的时候效果很差,不能商用。本文使用迭代法求阈值:预先设置一个阈值T,对图像中灰度值>T的像素点求出灰度平均值T1,图像中灰度值<T的像素点求出灰度平均值T2,若丨T1-T2丨<△则当前T即为最佳阈值,否则取T=(T1+T2)/2循环上述比较操作。二值化算法设计如下:

图6 二值化算法设计

本文中的二值化使用OpenCV的cvThreshold函数,该函数的典型应用是对灰度图像进行阈值操作得到二值图像,函数中的阈值使用上面迭代法求得,核心算法如下所示:

最后,按照预设步长和可忍耐边界值获取图像的边界点。定义某行或某列中白点占的百分比阈值为0.05,某行或

列中连续白点占的百分比阈值为0.02,连续的白点的百分比应该小于等于所有的白点的百分比,其中边缘遍历算法如下:

定位边缘点算法如下:

通过这种连续定位的方式,可以快速寻找图像边界,并消除由于曝光亮斑带来的困扰。并且从四个方向遍历图像找到四组边界点,左边需要从左到右遍历,右边需要从右往左遍历,上边需要从上往下遍历,下边需要从下往上遍历。在具体遍历过程中,为减少运算量和避免噪声带来的干扰,当白点总数>0.05和连续白点总数>0.02,才会定义为边界。

当四个方向都遍历结束,会在四个方向上分别得到四个点的x和y坐标。根据四个点的坐标输出四条直线围成的矩形,通过画方框的方式将去黑边的结果实时显示在视频窗口上。

4 Android利用OpenCV技术难点

4.1 关于如何传递摄像头预览的图像数据给Native代码

① 传递图片路径:这是最差的方式,速度很慢,主要用于前期开发的时候进行测试,测试Java层和Native层的互调是否正常。

② 传递预览图像的字节数组到Native层,然后将字节数组处理成RGB或者RGBA的格式,具体哪种格式要看图像处理函数能否处理RGBA格式的,如果可以的话推荐转换成RGBA格式,因为返回的也是RGBA格式的。转换方式有两种:一种方式是使用一个自定义的函数进行编码转换,另一种方式是使用OpenCV中的Mat和cvtColor函数进行转换,接着调用图像处理函数,处理完成之后,将处理的结果保存在一个整形数组中(实际上就是RGB或者RGBA格式的图像数据),最后调用Bitmap的方法将其转换成bitmap返回。这种方法速度也比较慢,但是比第一种方案要快很多。

③ 使用OpenCV的摄像头:JavaCamera或者NativeCamera都行,好处是它进行了很多的封装,可以直接将预览图像的Mat结构传递给Native层,这种传递是使用Mat的内存地址(long型),Native层只要根据这个地址将其封装成Mat就可以进行处理了,另外,它的回调函数的返回值也是Mat,非常方便。这种方式速度较快。

4.2 在Android中使用OpenCV调用摄像头

首先,是否是在原有的C/C++代码上进行移植,如果是的话,那么尽量考虑使用ndk开发,否则使用OpenCV for Android编写Java代码进行开发,效率不会比native代码低多少。

其次,如果是需要OpenCV library,是否能够容忍运行应用还需要安装OpenCV Manager,如果不能的话,则在开发时要考虑将OpenCV binaries添加到应用中进行static initialization,但其实使用OpenCV Manager是有很多好处的。

接着,是使用原生Android的Camera还是使用OpenCV的Camera,如果是OpenCV Camera的话,是使用Java调用摄像头还是Native调用摄像头。

最后,图片如何进行传递,如果是单张静态图片进行处理的话,只需要路径就行了,但是如果是在视频状态下对图片进行处理的话,那么就只能传递图像数据了,这里涉及到了Android中如何获取预览的图像数据以及如何将其传递到底层,又如何进行转换(一般是YUV转成RGB)使得OpenCV可以进行处理,处理完之后,又如何将处理得到的图片传递给Java层。采用图像数据传递方式,可以优化的地方,包括:

① 尽量使用Mat而不要使用IplImage;

② 尽量保证你的图像处理函数能够处理RGBA格式的图像;

③ 先压缩图像大小再对图像进行处理;

④ 使用noise filter降低图像中的噪声。

5 系统展示

目前,高拍仪可视化下去黑边系统已经实现商用,并支持多种语言版本,图7为最初一个系统版本在PC上的模拟,根据不同需求的用户反馈,经过后期多次修改不断升级,实现了跨平台的应用(Android和Windows平台),图8为在PC上的最新版本的系统界面,在实时跟踪、文档纠偏以及去黑边方面,用户评价良好,商用至今,实现零投诉。图9为系统输出对象,对比市场上现有的去黑边应用,不但去黑边效果显著,并且对环境变量要求低,适用范围广。

图7 可视化去黑边系统最初版本

图8 可视化去黑边系统最新版本

图9 系统实时输出对象

6 结语

采用本文设计的系统不但能够实现高拍仪下稳定的去黑边,而且能够实时显示拍摄的内容,达到去黑边结果可视化,使得用户知道将要扫描的文档是否可以正常完成去黑边操作,保证用户一次拍图就能够获取自己想要的图像,将高拍仪可视化的优点提到一个新的高度,同时给用户一种革新性的体验。

[1]Shervin Emami.Mastering Opencv with Practical Computer Vision[M].Packt PublishingLimited.2012

[2]Dr Paul Richard,JoseBraz. Computer Vision,Imaging and ComputerGraphics[M]. Springer-Verlag Berlin andHeidelberg GmbH&Co.K.2012

[3]Gary R.Bradski,AdrianKaehler.Learning OpenCV[M].O'Reilly Media,Inc,USA.2008.

[4]左飞,万晋森,刘航.Visual C++数字图像处理开发入门与编程实践[M].2008.

[5]江超,艾矫燕.基于OpenCV的摄像头动态手势轨迹识别及其应用[J].计算机应用,2012,32(s1):128-133.

[6]许才敬.Ubuntu下基于OpenCV的Canny边缘检测[J].数字技术与应用,2011(1):53-54.

[7]张丘,马利庄,高岩,等.票据图像预处理方法的研究[J].计算机仿真,2005,22(10):208-211.

[8]王海杰.文档影像图像处理中的纠偏与降噪研究[D].浙江大学,2008.

Method to Remove the Black Edge of Documents inAndroid System Based on OpenCV

Wang Xianfeng
(Guangdong Construction Vocational Technology Institute,Guangzhou 510440,Guangdong)

This paper presents a method to remove the black edge of documents inAndroid system based on open source computer vision library OpenCV.It introduces how to use OpenCV in Android,describes the specific steps of using JNI to call OpenCV function,which should be considered in using the camera.It describes the key process of using Android NDK to generate sharing library.The experimental results show that this Android application has good performance in removing black edge of documents in different types under different scenarios.

visualization;remove black edge;OpenCV;system design

TP391

A

1008-6609(2016)08-0001-05

王咸锋,男,海南澄迈人,本科,副教授,研究方向:图形图像处理。

广东省科技计划资助项目,项目编号:2009A040103002。

猜你喜欢
调用文档摄像头
浙江首试公路非现场执法新型摄像头
浅谈Matlab与Word文档的应用接口
摄像头连接器可提供360°视角图像
有人一声不吭向你扔了个文档
核电项目物项调用管理的应用研究
基于系统调用的恶意软件检测技术研究
基于RI码计算的Word复制文档鉴别
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
奔驰360°摄像头系统介绍
利用RFC技术实现SAP系统接口通信