美文网首页
在移动端上使用opencv 精减体积

在移动端上使用opencv 精减体积

作者: leef_7ac2 | 来源:发表于2020-11-03 18:16 被阅读0次

    在Android之类的移动环境中,如果选择OpenCV进行生产,您的重要目标之一就是减小库的大小并使其性能就绪。

    OpenCV是一个库,其中包含大量的Computer Vision算法,但是通常,在应用程序中使用这些算法的一小部分。因此,将需要的内容包括在内,而将其余的内容排除在外是非常有意义的。

    静态库与动态库

    一个可以静态随您的应用程序代码进行编译。

    另外,它可以在运行时动态链接。

    在本教程中,我们将创建一个动态库(即共享对象(.so))。

    环境:

    Ubuntu16.4 (docker container)

    cmake3.7.2

    NDKr14b

    OpenCV3.4.1 (or 3.0.x,2.4需要低版本cmake)

    Targetarmeabi-v7a (ARM based)

    Android API23

    1.下载 sdk

    https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip

    2.解压 sdk到/opt/android-ndk-r14b

    3.创建新的 toolchain 编译工具链(交叉编译)

    root@dc:/opt/android-ndk-r14b# ./build/tools/make_standalone_toolchain.py \ --arch arm \ --api 23 \ --install-dir /tmp/my-android-toolchain

    4.导出工具链编译工具链

    $ exportANDROID_STANDALONE_TOOLCHAIN=/tmp/my-android-toolchain/

    5.安装ninja,ant

    apt-get install ninja-build ant

    6.下载&编译opencv

    $ cd opencv/

    $ mkdir build $ cd build $ cmake \

    -DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake \

    -DANDROID_STL=gnustl_shared \

    -DANDROID_NATIVE_API_LEVEL=23 ..

    make -j12

    6.优化,减少非必要的 cv模块

    cv中的全部模块有:

    libopencv_calib3d.a libopencv_flann.a libopencv_java3.so libopencv_shape.a libopencv_video.a libopencv_core.a libopencv_highgui.a libopencv_ml.a libopencv_stitching.a libopencv_videoio.a libopencv_dnn.a libopencv_imgcodecs.a libopencv_objdetect.a libopencv_superres.a libopencv_videostab.a libopencv_features2d.a libopencv_imgproc.a libopencv_photo.a libopencv_ts.a

    常用模块有:

    libopencv_core.alibopencv_imgproc.aimgcodecs

    通过选择必要.a 文件,进行手动控制.so 体积,这里以core,imgpro两个模块演示.

    /home/linuxbrew/toolchain_opencv_android/bin/arm-linux-androideabi-gcc-4.9 -shared -o libopencv_tiny.so --sysroot=/home/linuxbrew/toolchain_opencv_android/sysroot -Wl,--whole-archive libopencv_core.a libopencv_imgproc.a -Wl,--no-whole-archive

    这里需要选择使用gcc,或者g++,wl选项可能不低版本中不支持.

    体积从7.8->3.7

    7.优化,strip 动态库

    /home/linuxbrew/toolchain_opencv_android/bin/arm-linux-androideabi-strip --strip-unneeded libopencv_tiny.so

    体积从7.8->2.9

    8.优化,手动控制.o文件

    bin/arm-linux-androideabi-ar x libopencv_core.a

    我们可以简单的理解为一个 cpp 文件编译成.o 文件,多个.o 可以合并为一个.a,多个.a或者.o文件连接成.so,这里是把.a 解压,选取需要的.a 文件,然后再组装我们需要的.so

    9.优化,手动控制.cpp文件文件

    如在imgpro,即图像处理模块中,在端上处理时,更可能的情况是什么了变换等方法,如果透视,仿射,缩放,插值,颜色变换,但是图像结构分析和形态的contour ,hull基本不会在端上使用,效率也比较低。此时可以考虑修改c++文件,或者使用8中的方法去掉相应的.o 文件。

    10.NDK,是一个总结的非常好的包,里面有各种平台的所需要的构建工具,包括x86,arm64等。在新的环境下,可以直接下载并配置好,不需要另外 apt 安装其他三方库。

    结论

    可以通过,6,7,正常减少体积,也可以8,7更精细减少体积,或者9,7,更精细减少。

    同时建议,不使用.so 进行进行发布,而采用.a方式与业务合并编译,这样可以有效减少非必要函数的自动打包发布。

    相关文章

      网友评论

          本文标题:在移动端上使用opencv 精减体积

          本文链接:https://www.haomeiwen.com/subject/eodivktx.html