创建OpenCV3.X-Android库

起因

2016年的最后一周,和西安研发中心的罗总,一起联调了安卓开发板中图像识别的算法。罗总提出OpenCV-Android库中包含了太多安卓开发板不需要的动态库,让我把这些不需要的动态库从OpenCV-Android库中剔除去。

参考 stevelilesopencv-android项目,我对新发布的 opencv-3.2.0-android-sdk.zip 进行了封装。

为什么要对OpenCV的安卓库进行封装?

因为官网提供的 opencv-3.2.0-android-sdk.zip,虽然可以直接导入使用,但是,需要用到相应平台的 apk。也就是说,如果,你要在自己的app中运行opencv的代码,需要先安装相应平台的apk。

OpenCV_3.2.0_Manager_3.20_arm64-v8a.apk
OpenCV_3.2.0_Manager_3.20_armeabi-v7a.apk
OpenCV_3.2.0_Manager_3.20_armeabi.apk
OpenCV_3.2.0_Manager_3.20_mips.apk
OpenCV_3.2.0_Manager_3.20_mips64.apk
OpenCV_3.2.0_Manager_3.20_x86.apk
OpenCV_3.2.0_Manager_3.20_x86_64.apk

readme.txt

How to select the proper version of OpenCV Manager
--------------------------------------------------

Since version 1.7 several packages of OpenCV Manager are built. Every package is targeted for some
specific hardware platform and includes corresponding OpenCV binaries. So, in all cases OpenCV
Manager uses built-in version of OpenCV. The new package selection logic in most cases simplifies
OpenCV installation on end user devices. In most cases OpenCV Manager may be installed automatically
from Google Play.

If Google Play is not available (i.e. on emulator, developer board, etc), you can install it
manually using adb tool:

    adb install <path-to-OpenCV-sdk>/apk/OpenCV_<version>_Manager_<app_version>_<platform>.apk

Example: OpenCV_3.2.0-dev_Manager_3.20_armeabi-v7a.apk

Use the list of platforms below to determine proper OpenCV Manager package for your device:

- armeabi (ARMv5, ARMv6)
- armeabi-v7a (ARMv7-A + NEON)
- arm64-v8a
- mips
- mips64
- x86
- x86_64

创建自己的OpenCV-Android库

1. 下载 OpenCV for Android

从OpenCV官网下载OpenCV3.2.0的OpenCV for Android压缩文件opencv-3.2.0-android-sdk.zip

2. 创建OpenCV4Android项目

利用Android Studio 2.2.3创建一个android项目,这里我创建的是OpenCV4Android项目。

3. 创建OpenCV-Android库

  • 依次点击File->New->New Module…,在弹出的对话框中,选择Android Library,然后,点击Next
  • Application/Library name:处,输入安卓库名称OpenCV-Android
    点击Package name:后面的Edit,修改包名称为org.opencv

4. 配置OpenCV-Android库

  • 解压下载的opencv-3.2.0-android-sdk.zip

  • 复制OpenCV-android-sdk/sdk/java/src/org/opencv文件夹内的所有子文件夹,并粘贴到自己创建的OpenCV-Android库中opencv-android/src/main/java/org/opencv的文件夹下。

  • opencv-android/src/main/java/org/opencv/android子文件中,做如下操作:

    • 删除AsyncServiceHelper.java文件
    • 修改OpenCVLoader.java文件,注释掉以下内容:
    /**
     * Loads and initializes OpenCV library using OpenCV Engine service.
     * @param Version OpenCV library version.
     * @param AppContext application context for connecting to the service.
     * @param Callback object, that implements LoaderCallbackInterface for handling the connection status.
     * @return Returns true if initialization of OpenCV is successful.
     */
    

// public static boolean initAsync(String Version, Context AppContext,
// LoaderCallbackInterface Callback)
// {
// return AsyncServiceHelper.initOpenCV(Version, AppContext, Callback);
// }
```

  • 复制OpenCV-android-sdk/sdk/java/res/values/attrs.xml到**opencv-android/src/main/java/res/values/**文件内;

  • 修改opencv-android/src/main/java/res/values/string.xml,修改后如下所示:

    <resources>
    <string name="app_name">OpenCV-3.2.0</string>
    </resources>
    
  • OpenCV-android-sdk/sdk/native/libs文件夹下的子文件夹和OpenCV-android-sdk/sdk/3rdparty/libs文件夹下的子文件夹拷贝opencv-android/src/main文件下创建的jniLibs文件夹内。

app文件内相关文件修改

修改app/src/main/res/layout/activity_main.xml

<TextView>添加id,修改后代码片段如下所示:

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

为app添加opencv-android库

  1. 点击File->Project Structure…打开Project Structure对话框;
  2. 点击Modules下的app,再在右侧点击Dependencies
  3. 点击Dependencies下框附近的+号,选择3 Module Dependency,在弹出的对话框中,选择**:opencv-android**,最后依次点击OKOK

修改MainActivity

添加TextView对象,如果点击该对象,则弹出一个短消息!

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView textView = (TextView) findViewById(R.id.text_view);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "You clicked textView!", Toast.LENGTH_SHORT).show();
                if (OpenCVLoader.initDebug()) {
                    textView.setText("OpenCV320 loaded successful!");
                }
            }
        });
    }
}

运行

点击Run->Run ‘app’,启动虚拟手机的界面如下所示:

在这里插入图片描述

点击,Hello World!后的界面如下所示:

在这里插入图片描述

找到opencv-android库对应的aar文件

opencv-android/build/outputs/aar文件夹下,有生成的debug和release两种格式的aar文件夹。

opencv-android-debug.aar
opencv-android-release.aar

如何导入aar文件

参考这里

Bonus

修改app和opencv-android文件夹内的build.gradle文件中的buildTypes字段,仅生成适合指定平台的apk文件。

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
            // added by JohnTian
            splits {
                abi {
                    enable true
                    reset()
                    include 'armeabi-v7a', 'arm64-v8a'
                    universalApk false
                }
            }
        }

Github

OpenCV4Android

写在最后

新的一年,祝福小伙伴们,新年快乐,身体健康,阖家欢乐,工作顺利,事事顺心!

要在Android项目中集成OpenCV,需要进行以下步骤: 1. 下载OpenCV Android SDK,可以从OpenCV官网上下载。将下载的压缩包解压到任意目录。 2. 在Android Studio中创建一个新项目,然后将解压后的OpenCV Android SDK目录中的opencv文件夹复制到项目的根目录下。 3. 在项目的build.gradle文件中添加以下代码: ``` android { ... defaultConfig { ... ndk { abiFilters "armeabi-v7a", "x86" } externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" arguments "-DANDROID_STL=c++_shared" } } } ... } dependencies { ... implementation project(':opencv') ... } ``` 4. 在项目的settings.gradle文件中添加以下代码: ``` include ':app', ':opencv' project(':opencv').projectDir = new File(rootProject.projectDir, 'opencv') ``` 5. 在项目的MainActivity.java文件中加载OpenCV文件,可以使用以下代码: ``` package com.example.myapplication; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { // OpenCV加载成功,可以进行相关操作 } break; default: { super.onManagerConnected(status); } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (!OpenCVLoader.initDebug()) { OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback); } else { mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } } ``` 这样,就可以在Android项目中成功集成OpenCV并使用OpenCV文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Digital2Slave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值