在Android上用手指抹画处理图像

        想实现的效果是在Android设备上,用手指在图片上抹画以选定一个不规则区域,而且在抹画的同时实时处理已选择的区域。

        关于如何在Windows中配置Android+OpenCV的环境,可以参考《Android上使用OpenCV处理图像》

        我的开发环境:

               Windows 7 x64

               Eclipse 4.4.0 32 Bit

               Android SDK 22.3

               OpenCV 2.4.8 Android SDK


界面与原理

        主界面有一个显示区域imageview,一个下拉列表spinner,一个滑动条seekbar,四个按钮btnBack、btnFill、btnSave、 btnSaveImage。

shinee-main

        imageview用来显示图片;spinner用来选择图像处理的方法;seekbar用于调节图像处理的参数;按钮btnBack用于返回图片选择界面(该界面的的代码见下文);按钮btnFill用来将当前的操作应用到整幅图片,而不只处理手指选择的区域;按钮btnSave用于暂时保存现在的效果,以便更换其他处理方式继续处理;按钮btnSaveImage则把处理的结果输出为JPEG文件。

shinee-spinner

        在spinner中选择一种方法后,便通过JNI调用C函数以使用OpenCV对整幅图像进行相应处理,并把结果保存在imgProc中。当调节seekbar的滑块时,实时调用同一C函数,只不过传入的参数是滑块位置改变后所代表的参数。在这个过程中imageview始终显示的是原始的图片。

        为了把改变应用到图片上,为Activity添加onTouchEvent,获得手指触摸的位置,同时获取imageview当前所显示的图像数据,与imgProc所保存的图像数据一同传递到一个名为combine的自定义C函数,该函数的作用是以触摸的位置为中心,以给定值(hdpi屏幕上为56)为半径画一个圆,圆内区域取imgProc的值,在圆外则取imageview的值,并把获得的图像返回。然后把这个返回的图像绘制到imageview中。

        这样,当手指触摸并移动时,程序会获得上一时刻的imageview,在当前时刻手指所在的圆形内进行处理,再用获得的结果来更新imageview,就实现了实时处理手指抹画区域的效果。

        如下图所示的边缘增强效果(将原图像与其Canny边缘图像相加)

edge-sharpen


代码

OpenImage.java    (打开图片的界面)

TouchProcess.java    (主界面)

activity_touch_process.xml    (主界面UI)

OpencvJni.java    (声明JNI接口)

OpencvJni.cpp    (部分,通过JNI调用的C函数)

共有4条评论

  1. 博主你好~我是一个android的初学者。目前在做一个基于Opencv的图像处理APP,但是感觉中文资料稀少一直不知所措。看到你的手指抹画APP后觉得大有启发,请问你能分享一下完整版的Opencvjni.cpp吗?

    1. 因为当时完整的Opencvjni.cpp用在了另一个项目中,不方便公开,我尽量找时间补充一个功能相近的文件。

      关于在Android上使用OpenCV的中文资料,我正在参与一本相关书籍的翻译工作,如果有了结果会第一时间推荐给你:)

发表评论

电子邮件地址不会被公开。 必填项已用*标注