Ubuntu18.04LTS环境下创建OpenCV4.x-Android库

1 背景

1.1 java.lang.UnsatisfiedLinkError: dlopen failed: library “libc++_shared.so” not found

libc++_shared.so 之前默认集成在 opencv_java3.so,但是在OpenCV4.x以后,该动态库默认不集成在opencv_java4.so

1.2 E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV

参考 https://github.com/opencv/opencv/issues/15567#issuecomment-1016603238。这个是OpenCV安卓SDK的问题,不影响正常使用OpenCV库。

2 创建OpenCV-Android库

2.1 下载 opencv-4.6.0-android-sdk

从OpenCV官网下载OpenCV4.6.0的OpenCV for Android压缩文件opencv-4.6.0-android-sdk.zip

2.2 创建OpenCV4Android项目

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

2.3 创建OpenCV-Android库

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

2.4 配置OpenCV-Android库

  • 解压下载的 opencv-4.6.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.xmlopencv-android/src/main/res/values/ 文件内;

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

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

3 app文件内相关文件修改

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

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

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cn.epbox.opencv4android.MainActivity">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

3.2 为app添加opencv-android库

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

3.3 修改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("OpenCV-4.6.0 loaded successful!");
                }
            }
        });
    }
}

4. 处理 library “libc++_shared.so” not found

  • 点击 File -> Settings… ,按照下图定位到SDK Tools,选择NDK最新版本号。依次点击Apply, OK。
    在这里插入图片描述
  • 复制 /home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.soopencv-android/src/main/jniLibs/arm64-v8a/
  • 复制 /home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.soopencv-android/src/main/jniLibs/armeabi-v7a/
  • 复制 /home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.soopencv-android/src/main/jniLibs/x86/
  • 复制/home/tianzx/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.soopencv-android/src/main/jniLibs/x86_64/

5. 运行

点击 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
                }
            }
        }

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
树莓派4b上安装Ubuntu18.04OpenCV的过程如下: 1. 首先,你需要下载Ubuntu18.04的操作系统并安装到树莓派4b上。 2. 安装OpenCV的依赖包。你可以使用以下命令来安装所需的依赖包: ``` sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev sudo apt-get install libxvidcore-dev libx264-dev sudo apt-get install libatlas-base-dev gfortran sudo apt-get install ffmpeg ``` 3. 下载并解压OpenCVOpenCV_contrib。你可以在以下链接中找到下载地址: OpenCV: https://opencv.org/opencv-4-1-1/ OpenCV_contrib: https://github.com/opencv/opencv_contrib/releases/tag/4.1.1 4. 将下载opencv_contrib-4.1.1文件夹放在opencv-4.1.1文件夹里。 5. 使用以下命令进入opencv-4.1.1文件夹,并解压下载的文件: ``` cd opencv-4.1.1 unzip opencv-4.1.1.zip unzip opencv-4.1.1.zip ``` 6. 进入解压后的文件夹,并使用cmake进行配置和编译: ``` cd opencv-4.1.1 mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.1.1/modules .. make -j4 sudo make install ``` 7. 安装完成后,你可以使用OpenCV来进行图像处理和计算机视觉相关的开发了。 请注意,上述步骤仅适用于树莓派4b上的Ubuntu18.04操作系统。如果你使用其他版本的Ubuntu或不同的操作系统,请参考相应的安装指南。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于树莓派4B Ubuntu18.04LTSOpenCV4.1.1 开发环境部署](https://blog.csdn.net/weixin_49818157/article/details/127861522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Ubuntu18.04安装opencv 3.2.0的解决方法](https://download.csdn.net/download/weixin_38637983/12842575)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Digital2Slave

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

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

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

打赏作者

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

抵扣说明:

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

余额充值