构建OpenCV for Android并将其与NDK一起使用

Jam*_*ama 4 android opencv cross-compiling android-ndk

背景:我目前正在Android Studio上为Moverio BT 200增强现实眼镜开发应用程序.我正在使用OpenCV,特别是库的arUco模块.该模块必须与NDK一起使用.此外,它不在稳定版本上,所以我自己编译了库(使用本指南:https://zami0xzami.wordpress.com/2016/03/17/building-opencv-for-android-from-source/) .图书馆的建设进展顺利.之后,我做了一个android studio项目(customOCVtest).我在使用OpenCV与Android Studio和NDK时总是这样做,除了这次是使用自定义构建.我检查了库是否正确加载:

private static final String OCVdevTAG = "OCVmainAct";

static {
    System.loadLibrary("native-lib");
    if(!OpenCVLoader.initDebug()) {
        Log.d(OCVdevTAG, "OpenCV not loaded");
    } else {
        Log.d(OCVdevTAG, "OpenCV loaded");
    }
}
Run Code Online (Sandbox Code Playgroud)

我构建时确实加载了库.

现在出现了问题:当我尝试在我的本机代码中实际使用arUco模块时(这是我的native-lib.cpp):

#include <jni.h>
#include <string>
#include <opencv2/aruco.hpp>

extern "C" {
jstring
Java_com_jambonsama_customocvtest_MainActivity_stringFromJNI(
    JNIEnv *env,
    jobject /* this */) {
std::string hello = "Hello from C++";
cv::Ptr<cv::aruco::Dictionary> dict = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::Mat marker;
cv::aruco::drawMarker(dict, 25, 200, marker, 1);
return env->NewStringUTF(hello.c_str());
}
}
Run Code Online (Sandbox Code Playgroud)

gradle sync工作,但我无法构建.我收到以下错误:

Error:FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
Error while executing 'C:\Users\JambonSama\AppData\Local\Android\Sdk\cmake\3.6.3155560\bin\cmake.exe' with arguments {--build C:\Users\JambonSama\AndroidStudioProjects\customOCVtest\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}
[1/1] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\mips64\libnative-lib.so
FAILED: cmd.exe /C "cd . && C:\Users\JambonSama\AppData\Local\Android\sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  -target mips64el-none-linux-android -gcc-toolchain C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64 --sysroot=C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/platforms/android-21/arch-mips64 -fPIC -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -fno-exceptions -fno-rtti -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -fno-exceptions -fno-rtti  -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info  -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\mips64\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_aruco.a -llog -lm "C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips64/libgnustl_static.a" && cd ."
C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a: error adding symbols: File in wrong format
  clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
Run Code Online (Sandbox Code Playgroud)

特别是,此错误消息告诉我,我尝试使用以下参数进行构建:

{--build C:\Users\JambonSama\AndroidStudioProjects\customOCVtest\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}
Run Code Online (Sandbox Code Playgroud)

该参数由AS自动生成,我找不到传递它的文件.我相信,如果我能找到它,我可以为手臂(这是我想要的)而不是mips建造.问题是,我找不到它.(而且我甚至不确定那确实是我正在寻找的.我只是想让我的项目为我的眼镜而建.)

以下是我的CMakeLists.txt:

# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             src/main/cpp/native-lib.cpp )

include_directories(C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/jni/include)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.


target_link_libraries( # Specifies the target library.
                       native-lib
                       C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a
                       C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_aruco.a

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
Run Code Online (Sandbox Code Playgroud)

这是我的app build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.jambonsama.customocvtest"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
    compile project(':openCVLibrary310dev')
}
Run Code Online (Sandbox Code Playgroud)

和我的openCVLibrary310dev build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "23.0.2"

    defaultConfig {
        ndk {
            abiFilter("armeabi-v7a")
        }
        minSdkVersion 14
        targetSdkVersion 25
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的,主要是复制那些帮助其他人解决类似地雷问题的东西:

#set(CMAKE_SYSTEM_NAME Android)
Run Code Online (Sandbox Code Playgroud)

要么

#set(CMAKE_TOOLCHAIN_FILE "Toolchain file" CACHE FILEPATH "C:/Libs/opencv_src/opencv/platforms/android.toolchain.cmake")
Run Code Online (Sandbox Code Playgroud)

要么

#set( CMAKE_CXX_COMPILER "C:/Libs/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++.exe" )
Run Code Online (Sandbox Code Playgroud)

在CMakeLists.txt中

splits {
    abi {
        enable true
        reset()
        include 'armeabi-v7a'
        universalApk true
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

tasks.getByPath(":app:linkMipsDebugRemoteDesktopSharedLibrary").enabled = false
Run Code Online (Sandbox Code Playgroud)

在build.gradle中(我试过这两个因为我不知道哪一个应该有它).

除了最后一点代码(task.getByPath ...),同步工作,但我无法构建.对于最后一个,我甚至无法同步.

我也尝试为mips重建库,因为架构似乎是问题,但我不知道如何做到这一点.

我在哪里可以找到以下参数所在的文件:

{--build C:\Users\JambonSama\AndroidStudioProjects\customOCVtest\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}
Run Code Online (Sandbox Code Playgroud)

建筑时通过?和/或如何让Android Studio构建我的arm架构项目?

Jam*_*ama 9

所以mips架构问题可以通过在android块的末尾添加以下代码到app的gradle.build来解决:

productFlavors {
    armv7 {
        ndk {
            abiFilter "armeabi-v7a"
        }
    }
    fat
}
Run Code Online (Sandbox Code Playgroud)

但随后出现了其他问题.值得注意的是,该库是使用Android Studio不喜欢的胡萝卜素选项构建的,然后,gzlib错过了,因此Android Studio无法构建和/或运行.经过多次试验,我终于实现了我的目标:在Windows上交叉编译openCV与Android的额外模块,并使用所述内置库构建AS项目以使其正常工作.我记录了我的整个过程,从下载openCV源代码直到在我的arm-architected设备上运行我的应用程序,我只是将它粘贴到这里,以便任何需要这样做的人.以下说明主要基于本教程(感谢编写它的Zamrath Nizam).该教程唯一的问题是它可能有点旧,所以需要改变一些选项/步骤.

来自WINDOWS的Android安装模块的交叉编译OPENCV

*第一:先决条件*

  • 下载OpenCV并解压缩(例如在'../opencv-source')
  • 下载OpenCV额外模块并解压缩(比如'../opencv-contrib-source')
  • 下载Android NDK(比如'../ndk-dir')
  • 下载CMake(说'../cmake-dir')和MinGW(说'../mingw-dir')
  • 安装Android Studio

*SECOND:配置CMake*

  • 转到'../opencv-source/platforms'并创建一个名为'build_android_arm'的文件夹
  • 在CMake中,使用以下路径填充以下前两个字段:
    1. 源代码在哪里:'../ opencv-source'
    2. 在哪里构建二进制文件:'../ opencv-source/platform/build_android_arm'
  • 通过"添加条目"添加以下选项:
    1. ANDROID_NDK,输入'path',值'../ndk-dir'
    2. ANDROID_NDK_HOST_X64,输入'bool',值为1
    3. CMAKE_TOOLCHAIN_FILE,输入'path',value'../opencv-source/platforms/android/android.toolchain.cmake'
  • 按'配置'
  • 选择'MinGW Makefiles'作为编译器
  • 选择"指定工具链文件以进行交叉编译"
  • 按'下一步',然后'完成'
    • 注1:只要你没有错误信息,一切都很好.不要担心警告消息(比如CMake告诉你你正在做旧事).
    • 注意2:如果您无法在该步骤进行配置,请尝试阅读接下来的几点,这可能有所帮助.
  • 通过"搜索"字段更改以下附加选项:

    1. EXTRA_MODULE_PATH,输入'path',value'../opencv-contrib-source/modules'
    2. WITH_CAROTENE,输入'bool',值为0
    3. BUILD_ZLIB,输入'bool',值为1
      • 注意:您必须在此步骤之前已经配置一次,因为之前创建的变量在"未分组条目"组下重新分组,而以下变量是CMake自动生成的变量,并且需要在正确的组中进行分组(不是'未分组的条目').
  • 验证是否正确设置了以下选项(通过"搜索"字段):

    1. ANDROID_NDK_HOST_X64,输入'bool',值为1
    2. CMAKE_MAKE_PROGRAM,输入'path',值'../mingw-dir/bin/mingw32-make.exe'.这个选项,我实际上没有在我的CMake配置中.如果你按"配置",它不起作用你没有这个选项,那么你应该尝试添加它(但我不知道如何).如果按"配置"时没有任何问题,请不要担心该变量.此检查来自上面链接的原始教程.
    3. CMAKE_TOOLCHAIN_FILE,输入'path',value'../opencv-source/platforms/android/android.toolchain.cmake'
  • 按'配置'

  • 选择'MinGW Makefiles'作为编译器
  • 选择"指定工具链文件以进行交叉编译"
  • 按'下一步',然后'完成'
  • 按'生成'

*第三:用mingw*编译

  • 转到'../mingw-dir/msys/1.0'并运行'msys'bash文件
  • 导航到'../opencv-source/platforms/android_arm'
  • 运行'mingw32-make'命令
  • 运行'mingw32-make install'命令

*第四个:android项目*

  • 启动Android Studio并创建一个新项目:
    1. 选择文件 - >新建 - >新建项目...
    2. 用'cOCV'填写'应用程序名称'
    3. 选中"包括C++支持"框
    4. 点击下一步'
    5. 选择你的最小SDK(比方说API 14:Android 4.0(IceCreamSandwich))
    6. 点击"下一步","下一步"和"完成"
  • 转到文件 - >新建 - >导入模块...

    1. 提供'../opencv-source/platforms/android_arm/install/sdk/java'
    2. 点击"下一步"和"完成"
  • 更改openCVLibraryXXX(导入模块)文件夹中build.gradle文件中的目标:

    1. compileSdkVersion和targetSdkVersion应该相同,大于或等于23
    2. minSdkVersioon应与创建项目时指定的相同
  • 在openCVLibraryXXX(导入的模块)文件夹中的build.gradle文件中:

    1. 将'apply plugin:com.android.application'替换为'apply plugin:com.android.library'
    2. 删除行'applicationId'org.opencv"'
      • 注意:完成最后一步是为了避免出现以下错误:'未指定项目应用程序解析为不支持作为编译依赖项的APK存档'.
  • 将导入的库作为依赖项添加到文件 - >'项目结构'中的'app'模块

  • 在'app/src/main'中创建一个jniLibs文件夹:

    1. 右键单击左侧菜单中Android视图中的"app"
    2. 单击"新建文件夹-JNI文件夹"
    3. 检查'更改文件夹位置'
    4. 将'Target Source Set'设置为'app/src/main/jniLibs'
  • 将OpenCV的库从'opencv-source/platforms/android_arm/install/sdk/native/libs'复制到'AndroidStudioProjects/cOCV/app/src/main/jniLibs'文件夹中新创建的文件夹(jniLibs)中

    • 注意:例如,我的AndroidStudioProjects文件夹位于'C:\ Users\JambonSama\AndroidStudioProjects'.
  • 在'opencv-contrib-source/modules/module_you_desperately_need/CMakeLists.txt'中,更改'ocv_define_module(module_you_desperately_need opencv opencv)以及'ocv_define_module(module_you_desperately_need opencv,其他一些模块WRAP java)'

    • 注1:这个步骤可能是无用的,因为WRAP java可能已经写在文件中了.
    • 注意2:如果'python'也被写入,那就没问题,你可以把它写在原来的位置.
  • 在CMakeLists.txt中,添加:

    1. 'add_library'块之后和'find_library'块之前的以下两行:

       include_directories(../opencv_src/opencv/platforms/build_android_armn/install/sdk/native/jni/include)
       link_directories(../AndroidStudioProjects/cOCVn/app/src/main/jniLibs/armeabi-v7a)
      
      Run Code Online (Sandbox Code Playgroud)
      • 注意:这两行非常直接地给出了include和link目录的路径
    2. 'find_library'块之后和'target_link_libraries'块之后的以下行:

       file(GLOB PARTYLIBS "../opencv_src/opencv/platforms/build_android_armn/install/sdk/native/3rdparty/libs/armeabi-v7a/*.a")
       file(GLOB CVLIBS  "../opencv_src/opencv/platforms/build_android_armn/install/sdk/native/libs/armeabi-v7a/*.a")
      
      Run Code Online (Sandbox Code Playgroud)
      • 注意:这些是为了更简单的链接命令,请参阅下一点.
    3. 以下路径,AS WRITTEN,在'target_link_libraries'中,在'native-lib'变量之后,在'$ {log-lib}'变量之前:

       ${CVLIBS}
       ${PARTYLIBS}
       ${CVLIBS}
      
      Run Code Online (Sandbox Code Playgroud)
      • 注意:这是棘手的部分:由于周期性依赖,你必须再次编写CVLIBS,PARTYLIBS和CVLIBS,否则你不会停止链接错误.到现在为止,一切都应该联系起来.
  • 在app的gradle.build中,添加以下代码:

         productFlavors {
             armv7 {
                 ndk {
                     abiFilter "armeabi-v7a"
                 }
             }
             fat
        }
    
    Run Code Online (Sandbox Code Playgroud)

    在android块的末尾

    • 注意:这可以通过指定一次和所有arm架构来防止构建时出现mips64体系结构错误
  • 在native-lib.cpp中:

    1. 在'stringFromJNI'函数中尝试以下代码(这个函数在创建项目时由AS自动生成)

       cv::Mat test;
       cv::VideoCapture camera;
       camera.open(0);
       cv::Ptrcv::aruco::Dictionary dict = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
       cv::Mat marker;
       cv::aruco::drawMarker(dict, 25, 200, marker, 1);
       std::string hello = "Hello from C++";
       return env-NewStringUTF(hello.c_str());
      
      Run Code Online (Sandbox Code Playgroud)
    2. 不要忘记以下内容包括:

       #include jni.h
       #include string
       #include opencv2/aruco.hpp
       #include opencv2/videoio.hpp
      
      Run Code Online (Sandbox Code Playgroud)
      • 注意:因为在函数结束之前没有生成字符串,所以,当你测试时,如果字符串确实显示在屏幕上,那么该函数已经完成而没有问题,并且你很好(因为上面提供的代码使用了一些不在稳定版本上的模块,截至2016年12月12日(12月8日,我用dd/mm/yyyy格式写日期).
  • 时间来测试:

    1. 同步gradle
    2. 建立
    3. 在一个手臂设备上运行

你很高兴\ o \\ O // o /

补充说明 :

  • 所有gradle.build文件和CMakeLists.txt文件都可以在AS窗口左侧菜单中的Android View上轻松找到.
  • 请记住,如果您在命令窗口中导航时出现错误,可能您的'/'应为'\'或反之亦然.('cd'命令在命令窗口中导航).
  • 我在Windows10上运行.
  • 如果你不太确定你应该在屏幕上逐步看到什么,我在答案开头提到的教程应该会让你知道在AS项目创建之前你应该看到什么.然后,您可以看一下本教程,该教程解释了如何在Android Studio项目中为官方发布设置OpenCV SDK.我提供的步骤与这些教程不同,但我把它们放在这里,因为它们可以帮助您了解屏幕/窗口应该是什么样子.