说明

使用 AS v1.4.1 测试,但也应该使用更新的版本。

  1. 使用项目向导创建一个新的 Android Studio 项目(菜单:/ File / New Project):

    • 称之为cvtest1
    • 外形: API 19,Android 4.4(KitKat)
    • **** 名为 MainActivity 的空白活动 ****

    你应该有一个存储此项目的 cvtest1 目录。 (Android studio 的标题栏显示了打开项目时 cvtest1 的位置)

  2. 验证你的应用是否正常运行。尝试更改类似 Hello World 文本的内容,以确认构建/测试周期适合你。 (我正在使用 API​​ 19 设备的模拟器进行测试)。

  3. 下载适用于 Android v3.1.0 的 OpenCV 软件包,并将其解压缩到某个临时目录中。 (确保它是专门用于 Android 的软件包,而不仅仅是 OpenCV for Java 软件包。)我将这个目录称为unzip-dirunzip-dir 下面你应该有一个 sdk / native / libs 目录,其子目录以像 arm …, mips ……和 x86 ……(每个类型的架构Android 运行一个)

  4. 从 Android Studio 将 OpenCV 作为模块导入项目: Menu:/ File / New / Import_Module

    • 源目录: {unzip-dir} / sdk / java
    • 模块名称:Android studio 会自动使用 openCVLibrary310 填写此字段 (确切的名称可能并不重要,但我们将继续使用此功能)。
    • 点击下一步。你将获得一个包含三个复选框的屏幕以及有关 jar,库和导入选项的问题。应检查所有三个。单击 Finish。

    Android Studio 开始导入模块,你将看到一个 import-summary.txt 文件,其中包含未导入的内容列表(主要是 javadoc 文件)和其他信息。
    https://i.stack.imgur.com/KJOHU.jpg

    但你也可以得到一个错误信息说没有找到目标与哈希字符串“机器人 -14” …… 。发生这种情况是因为你下载的 OpenCV zip 文件中的 build.gradle 文件说使用 Android API 版本 14 进行编译,默认情况下你没有 Android Studio v1.4.1。 https://i.stack.imgur.com/7NgDd.jpg

  5. 打开项目结构对话框( 菜单:/ File / Project_Structure )。选择 app 模块,单击 Dependencies 选项卡并添加 :openCVLibrary310 作为模块依赖项。当你选择 **Add / Module_Dependency 时,**它应该出现在你可以添加的模块列表中。它现在将显示为依赖项,但你将在事件日志中获得更多 not not-find-android-14 错误。

  6. 查看 app 模块的 build.gradle 文件。Android 项目中有多个 build.gradle 文件。你想要的是在 cvtest1 / app 目录中,从项目视图看起来就像 build.gradle(Module:app) 。请注意这四个字段的值:

    • compileSDKVersion(我说 23)
    • buildToolsVersion(我说 23.0.2)
    • minSdkVersion(我说 19)
    • targetSdkVersion(我说 23)
  7. 你的项目现在有一个 cvtest1 / OpenCVLibrary310 目录,但从项目视图中看不到:

StackOverflow 文档

使用其他工具,例如任何文件管理器,然后转到此目录。你还可以将项目视图从 Android 切换到 Project Files ,你可以找到此目录,如此屏幕截图所示: StackOverflow 文档

里面有另一个 build.gradle 文件(在上面的截图中突出显示)。使用步骤 6 中的四个值更新此文件。

  1. 重新同步项目,然后清理/重建它。 ( 菜单:/ Build / Clean_Project )它应该清理并构建没有错误,你应该在 0:Messages 屏幕中看到许多引用 :openCVLibrary310 。 ****

    https://i.stack.imgur.com/57IxS.jpg

    此时,模块应该作为 openCVLibrary310 出现在项目层次结构中,就像 app 一样。 (注意,在小下拉菜单中我切换回从项目视图Android 设备上查看 )。你还应该在 Gradle Scripts 下看到一个额外的 build.gradle 文件,但我发现 Android Studio 界面有点小问题,有时它不会立即执行此操作。因此,尝试重新同步,清理甚至重新启动 Android Studio。

    你应该在这个截图中看到带有 java 下所有 OpenCV 函数的 openCVLibrary310 模块:

    https://i.stack.imgur.com/FzGnD.jpg

  2. {unzip-dir} / sdk / native / libs 目录(及其下的所有内容) 复制到你的 Android 项目,复制cvtest1 / OpenCVLibrary310 / src / main / ,然后将你的副本从 libs 重命名为 jniLibs 。你现在应该有一个 cvtest1 / OpenCVLibrary310 / src / main / jniLibs 目录。重新同步项目,此目录现在应该出现在 openCVLibrary310 下的项目视图中。

    StackOverflow 文档

  3. 转到 MainActivity.java 的 onCreate 方法并附加以下代码:

if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }

然后运行你的应用程序你应该在 Android Monitor 中看到这样的行:

https://i.stack.imgur.com/Tqz9H.jpg

(我不知道为什么那行包含错误信息)

  1. 现在尝试实际使用一些 openCV 代码。在下面的示例中,我将 .jpg 文件复制到 android 模拟器上的 cvtest1 应用程序的缓存目录中。下面的代码加载此图像,运行 canny 边缘检测算法,然后将结果写回同一目录中的 .png 文件。
Put this code just below the code from the previous step and alter it to match your own files/directories.
 
    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;

    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.

    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;

    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
  1. 运行你的应用程序你的模拟器应创建黑白边缘图像。你可以使用 Android 设备监视器检索输出或编写活动以显示它。