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

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

英文原版购书链接:亚马逊《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-Chp5-r3

        关于在Android Studio上配置OpenCV开发环境的方法,请参考《在Android Studio上进行OpenCV 3.1开发》

        本章介绍如何在Android Studio 2上通过OpenCV使用常见的目标追踪算法,涉及的算法有光流法,图像金字塔以及KTL追踪器。关于以上各算法的原理可以参考《深入OpenCV Android应用开发》第五章。


开发环境

        Windows 10 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_chp5。导入OpenCV-android-sdk\sdk\java到项目中,并为app模块加载模块依赖。

        2. 将app\src\main\java\net\johnhany\moaap_chp5\MainActivity.java文件修改为如下内容:

        3. 修改app\src\main\res\layout\activity_main.xml文件:

        4.app\src\main\java\net\johnhany\moaap_chp5下新建一个HomeActivity.java文件,其内容为:

        5.app\src\main\res\layout下新建一个activity_home.xml文件,其内容为:

        6.app\src\main\java\net\johnhany\moaap_chp5下新建一个PyramidActivity.java文件,文件内容为:

        7.app\src\main\res\layout下新建一个activity_pyramid.xml文件,文件内容为:

        8. 在app\src\main\res目录下创建一个名为menu的Andorid resource directory,再在res\menu中创建一个menu_main.xml文件:

        9. 在app\src\main\res\menu目录下新建一个名为menu_pyramid.xml的文件,其内容为:

        10. 修改app\src\main\res\AndroidManifest.xml文件为如下内容:

        11. 修改app\src\main\res\values\strings.xml文件:

        12. 修改app\src\main\res\values\styles.xml文件:

        13. app\build.gradle文件修改为:

        14. openCVLibrary320\build.gradle文件修改为:

        15. 检查一下项目根目录的build.gradle文件是否为如下内容:


运行效果

        右上角的菜单选择Optical Flow,移动手机时,在画面上局部像素的运动会以下图中的白线表示出来。

        选择KLT Tracker,则程序会在第一帧图像中选取若干追踪点,并在移动镜头时进行追踪。如果追踪点超出画面的范围,就会造成追踪失败,需要再一次点击KLT Tracker开始新的追踪。

共有2条评论

  1. 200行后面建议加上两句:

    Core.normalize(srcResult,srcResult,0,255,Core.NORM_MINMAX);
    Core.add(srcResult,new Mat(srcResult.rows(),srcResult.cols(),CvType.CV_8UC4, new Scalar(0,0,0,255)),srcResult);

    一个是增加对比度,一个是把Alpha值加回去

  2. 在我的机器上scrRes格式为RGBA

    224行:imwrite 执行后,文件浏览呈反色

    227行: Imgproc.cvtColor(srcRes, src1, Imgproc.COLOR_BGR2BGRA) 执行后,scr1 为BGRA,imwrite 执行后,文件浏览正常彩色。(此处不应该啊BGR to BGRA不应该出现调换啊)

    230行:Imgproc.cvtColor(srcRes, src1, Imgproc.COLOR_BGR2RGBA)执行后,scr1为RGBA和scrRes格式一样。(此处也不正常该调换的又没调换)

    难道OPENCV源码可以自己纠正到底是RGBA还是BGRA?我是这么写的:

     Imgcodecs.imwrite(Environment.getExternalStorageDirectory() + "/Download/MOAAP/Chapter5/" + ACTION_MODE + "-imwrite.png", srcRes);

     Mat src1 = new Mat();

    Imgproc.cvtColor(srcRes, src1, Imgproc.COLOR_RGBA2BGRA);

    Imgcodecs.imwrite(Environment.getExternalStorageDirectory() + "/Download/MOAAP/Chapter5/" + ACTION_MODE + "-imwriteBGRA.png", src1);

    230 ,231行去掉

发表评论

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