深入OpenCV Android应用开发 中文版 – 第一章代码更新

book

本书中文版链接:京东  当当

英文原版链接:亚马逊《Mastering OpenCV Android Application Programming》


        原书所给代码以章为单位,针对的Android版本从API 19到API 21不等,同时使用的OpenCV库版本也有2.4.9和2.4.10两种。本文给出的代码是在原书代码的基础上,针对Android 7.0(API 24)与OpenCV 3.2进行了修改,补充了一些注释,适当地增加了一些预处理操作,以使代码整体上更合理。

        原书的完整代码可以在这里获取:https://www.packtpub.com/lcode_download/22299

        更新后的代码托管在GitHub:https://github.com/johnhany/MOAAP/tree/master/MOAAP-Chp1-r3

        关于在Android Studio上配置OpenCV 3.1开发环境的方法,请参考《在Android Studio上进行OpenCV 3.1开发》。OpenCV 3.2的配置方法与之相似,不过在配置过程中要注意版本上的不同。

        本章主要利用OpenCV Java API对图像进行一些常见的滤波操作,包括均值模糊、高斯模糊、中值模糊、膨胀、腐蚀、阈值化以及自适应阈值化。本章不涉及NDK开发及多线程。


更新记录:

        2017.07.24更新:代码更新到Android Studio 2.3.3。

        2016.07.23更新:针对API 23增加了新的动态权限申请机制,以解决Android 6.0上运行时权限失败的错误。(这里这里。)


开发环境:

        Windows 10 x64专业版(Windows 7 x64旗舰版也验证通过)

        Android Studio 2.3.3(Gradle 3.3,Android Plugin 2.3.3)

        Android 7.0(API 24)

        JDK 8u141

        OpenCV 3.2.0 Android SDK


代码及简略解释:

        1.创建Android Studio项目,包命名为net.johnhany.moaap_chp1

        2.app\src\main\java目录中找到net.johnhany.moaap_chp1包,为MainActivity.java添加如下代码:

        与原来的代码产生的变化有:

        (1)去掉了一些无用的import

        (2)增加了一个Mat src_gray用来保存灰度图像(因为阈值化和自适应阈值化只能应用在灰度图像上,而膨胀和腐蚀操作只能应用在二值图像上),相应地为阈值化和自适应阈值化增加了转换成灰度的步骤,为膨胀和腐蚀增加了转换成灰度并阈值化的步骤;

        (3)把Log.d()中的tag长度减小(因为编译器会有超过最大长度的warning);

        (4)增加了高斯滤波、均值滤波和中值滤波的核的尺寸;

        (5)在动作栏添加返回按钮的代码由

修改为

        (6)onResume()中的OPENCV_VERSION_2_4_10改为OPENCV_VERSION_3_2_0

        (7)类定义中由extends Activity改为extends AppCompatActivity

        (8)添加了动态权限申请代码,参考:https://developer.android.com/training/permissions/requesting.htmlhttp://www.jianshu.com/p/b4a8b3d4f587

        一些补充:

        (1)在onOptionsItemSelected()中,如果对MenuItem item执行了一些处理,则需要返回true;否则返回super.onOptionsItemSelected(item)

        (2)在onActivityResult()的第一行添加的

一般是不会执行任何操作的,但是这样写是为了防止一些特殊情况。比如当使用的是FragmentActivitySherlockFragmentActivity时,这一行就很有必要了。(参考:http://stackoverflow.com/questions/11745366/is-there-a-need-to-use-super-onactivityresult-in-onactivityresult。)

        3.net.johnhany.moaap_chp1包内创建一个HomeActivity.java文件,添加以下代码:

        与原来的代码产生的变化有:

        (1)去掉了一些无用的import

        4.修改res\layout\activity_main.xml文件,添加以下内容:

        5.res\layout下创建一个activity_home.xml文件,添加以下内容:

        与原来的代码产生的变化有:

        LinearLayout标签中的

改为

        6.res目录下创建一个名为menuRes Folder,再在res\menu中创建一个如下的menu_main.xml文件:

        与原来的代码产生的变化有:

        (1)去掉了menu标签中的tools:context一行;

        (2)为menu标签添加一行

        (3)将item标签中的android:showAsAction改为app:showAsAction

        7.打开res\values\strings.xml文件,修改为以下内容:

        8.修改res\AndroidManifest.xml文件为如下内容:

        与原来的代码产生的变化有:

        (1)去掉了uses-sdk标签,因为该属性总是会被build.gradle中设置的值所覆盖;

        (2)去掉了设置PARENT_ACTIVITYmeta-data标签。

        (3)删除了多余的权限申请。

        9.检查一下app\build.gradle文件是否为以下内容:

        其中,compileSdkVersionbuildToolsVersiontargetSdkVersion三个版本可以自定,com.android.support:appcompat的版本最好与targetSdkVersion相一致,比如同为23或24。

        10.检查openCVLibrary320\build.gradle文件是否为以下内容:


运行效果:

moaap_chapter1

共有3条评论

  1. 询问博主一个题外问题,opencvforandroid支持打开视频文件吗?我正在实现一个处理视频的功能,使用Android自带的getFrameAtTime取帧好慢啊,间隔短的话还会乱序,楼主能不能给点建议

    1. 我也曾用2.4版本尝试过直接读取视频,确实效率很低。时间间隔短产生乱序也是解码器的问题。用logcat载入OpenCV Manager时可以看一下Android Monitor中的调试信息,预编译的opencv android sdk的Video I/O一项是空的,说明它并不自带视频解码库。如此看来,如果要高效地在opencv中读取视频,还需要自己用ndk手动编译ffmpeg才行。

发表评论

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