深入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:

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

        本章利用OpenCV Java API对图像进行一些基本的特征检测操作,包括Canny边缘检测、Sobel算子、Harris角点检测、霍夫直线检测、霍夫圆检测。本章不涉及NDK开发及多线程。


更新记录:

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


开发环境:

        Windows 10 x64专业版(Windows 7 x64旗舰版以及Ubuntu 16.04 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_chp2

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

        与原来的代码相比,产生的变化较大,主要集中在:

        (1)去掉了一些无用的import,增加了一些必要的import;

        (2)在onCreate()中增加了动态权限申请机制,并增加了相应变量REQUEST_READ_EXTERNAL_STORAGEread_external_storage_granted,修改了菜单动作、载入图片的处理逻辑。

        (3)在onActivityResult()中增加了对读取图像文件的Cursor是否为空的判断,避免出现Java.Lang.NullPointerException错误。

        (4)修改了选取图片的代码。

        (5)更新了OpenCV的版本,OPENCV_VERSION_2_4_9改为OPENCV_VERSION_3_2_0

        关于动态权限申请机制的补充:

        该机制是于Android 6.0(API Level 23)开始引入的。如果你的应用的targetSdkVersion低于23,则不必考虑这一点。但是对于API 23及更高版本的系统,对于比较关键敏感的权限,不仅需要在AndroidManifest.xml中进行声明,还需要在Java代码中于需要的时候进行动态地申请。

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

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

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

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

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

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

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

        7.app\build.gradle文件修改为以下内容:

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

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


运行效果:

Screenshot_20160723

共有7条评论

  1.             Matrix rotate90 = new Matrix();

                rotate90.postRotate(orientation);

    这两行没什么用

  2. 第九章的代码你有运行过吗?运行成功没有,我这有一个问题是检测角点失败,希望大神帮助解决,谢谢!

  3. 博主,请问一个问题。

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

    为什么每个文件我创建了menu之后,添加xml文件,然后就算把 root bag 改好了,xml文件都会跑到layout的文件夹下面去,,这个文件输入代码之后也是错误的,提示 element dosen't require attribute android…好像是这样的提示 出来?

发表评论

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