如何在android studio中使用gradle构建工具使用opencv?

Ome*_*mez 60 android opencv gradle android-gradle-plugin

我想使用Android Studio使用Gradle构建工具开发应用程序.我无法插入OpenCV repo和库build.gradle.我的.gradle文件如下:

buildscript {
    repositories {
        mavenCentral()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.android.support:support-v4:13.0.+'
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在我的项目中添加OpenCV?谢谢.

Aja*_*y S 130

您可以在Android Studio中轻松完成此操作.

按照以下步骤将项目中的Open CV添加为库.

  1. libraries在项目主目录下创建一个文件夹.例如,如果您的项目是OpenCVExamples,您将创建一个OpenCVExamples/libraries文件夹.

  2. 转到SDK"\ OpenCV-2.4.8-android-sdk\sdk"的位置,在这里找到该java文件夹,将其重命名为opencv.

  3. 现在将SDK中的完整opencv目录复制到刚刚创建的libraries文件夹中.

  4. 现在build.gradleopencv目录中创建一个包含以下内容的文件

    apply plugin: 'android-library'
    
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.9.+'
        }
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.1"
    
        defaultConfig {
            minSdkVersion 8
            targetSdkVersion 19
            versionCode 2480
            versionName "2.4.8"
        }
    
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                res.srcDirs = ['res']
                aidl.srcDirs = ['src']
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在应用程序的主目录中编辑settings.gradle文件并添加以下行:

    include ':libraries:opencv'
    
    Run Code Online (Sandbox Code Playgroud)
  6. 将您的项目与Gradle同步,它应该是这样的

    屏幕1

  7. 右键单击您的项目,然后单击Open Module Settings左侧列表中的"选择模块",单击应用程序的模块,单击"依赖项"选项卡,然后单击"+"按钮以添加新的模块依赖项.

    在此输入图像描述

  8. 选择Module dependency.它将打开一个对话框,其中包含可供选择的模块列表; 选择":libraries:opencv".

    在此输入图像描述

  9. jniLibs在该/app/src/main/位置创建一个文件夹,并jniLibs使用OpenCV SDK 中的*.so文件(armeabi,armeabi-v7a,mips,x86)复制所有文件夹.

    在此输入图像描述

  10. 单击确定.现在一切都完成了,去OpenCV享受.

  • "你可以在Android Studio中轻松完成这项工作." - 是的,对,完全直截了当...... :)但是非常感谢,你的解决方案终于帮助我建立了这个.我想问一下将文件复制到jniLibs目录中.它复制了150兆字节的数据.这些都将包括在最终申请中吗?如果是,是否有必要?我的意思是可以包含opencv而不会使应用程序不必要地大吗? (16认同)
  • 在步骤9中,我在OpenCV SDK中看不到`jniLibs`文件夹.经过一番观察后,我确实找到了包含*.so文件的文件夹,但它们都在这个目录中:`OpenCV-3.0.0-android-sdk-1\OpenCV-android-sdk\sdk \native\libs`可以吗只是我正在使用更新版本的OpenCV SDK? (5认同)
  • @TGMCians在第6步中我收到此错误:_**错误:无法从project-path/libraries/AndroidManifest.xml**_读取packageName.它应该进行修改吗?如何? (2认同)

Kir*_*ran 25

根据OpenCV docs(1),以下使用OpenCV管理器的步骤是将OpenCV用于生产运行的推荐方法.但是,OpenCV manager(2)是Google Play商店的额外安装.所以,如果您更喜欢自包含的apk(不使用OpenCV管理器)或者目前处于开发/测试阶段,我建议您回答/sf/answers/1919504611/.

在Open Studio中使用OpenCV管理器在Open Studio中使用OpenCV的建议步骤.

  1. 解压缩从OpenCV.org下载的OpenCV Android sdk(3)
  2. File -> Import Module,sdk/java在解压缩的opencv存档中选择文件夹.
  3. 更新build.gradle项下的进口OpenCV的模块更新4场,以配合你的项目的build.gradle一个)compileSdkVersion B)buildToolsVersion C)的minSdkVersion和4)targetSdkVersion.
  4. 添加模块依赖项Application -> Module Settings,然后选择Dependencies选项卡.单击+底部(或右侧)的图标,选择Module Dependency并选择导入的OpenCV模块.

最后一步,在您的Activity类中,添加下面的代码段.

    public class SampleJava extends Activity  {

        private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch(status) {
                case LoaderCallbackInterface.SUCCESS:
                    Log.i(TAG,"OpenCV Manager Connected");
                    //from now onwards, you can use OpenCV API
                    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
                    break;
                case LoaderCallbackInterface.INIT_FAILED:
                    Log.i(TAG,"Init Failed");
                    break;
                case LoaderCallbackInterface.INSTALL_CANCELED:
                    Log.i(TAG,"Install Cancelled");
                    break;
                case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
                    Log.i(TAG,"Incompatible Version");
                    break;
                case LoaderCallbackInterface.MARKET_ERROR:
                    Log.i(TAG,"Market Error");
                    break;
                default:
                    Log.i(TAG,"OpenCV Manager Install");
                    super.onManagerConnected(status);
                    break;
            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        //initialize OpenCV manager
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:在接收到onManagerConnected方法成功回调后,您才能进行OpenCV调用.在运行期间,系统将提示您从Play商店安装OpenCV管理器(如果尚未安装).在开发过程中,如果您无法访问Play商店或使用emualtor,请apk在下载的OpenCV sdk存档下的文件夹中使用相应的OpenCV manager apk .

优点

  • Apk大小减少约40 MB(考虑升级).
  • OpenCV管理器为您的硬件安装优化的二进制文件,这有助于提高速度.
  • 升级到OpenCV管理器可能会使您的应用程序免于OpenCV中的错误.
  • 不同的应用程序可以共享相同的OpenCV库.

缺点

  • 最终用户体验 - 可能不喜欢您的应用程序的安装提示.


Mal*_*lte 11

由于OpenCV的集成是这样的努力,我们预先打包并通过JCenter在这里发布:https://github.com/quickbirdstudios/opencv-android

只需在模块的build.gradle依赖项部分中包含它

dependencies {
  implementation 'com.quickbirdstudios:opencv:3.4.1'
}
Run Code Online (Sandbox Code Playgroud)

这在你的项目的build.gradle存储库部分

repositories {
  jcenter()
}
Run Code Online (Sandbox Code Playgroud)

在gradle导入后你不会得到lint错误但是不要忘记在MainActivity中初始化这样的OpenCV库

public class MainActivity extends Activity {
    static {
        if (!OpenCVLoader.initDebug())
            Log.d("ERROR", "Unable to load OpenCV");
        else
            Log.d("SUCCESS", "OpenCV loaded");
    }
...
...
...
...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!我实在不明白OpenCV官方没有提供这样的解决方案。 (2认同)

Pai*_*ito 9

如果您不想使用JavaCV,这对我有用...

步骤1-下载资源

http://opencv.org/downloads.html下载OpenCV Android SDK

第2步 - 将OpenCV二进制文件复制到APK中

复制libopencv_info.so和libopencv_java.so

OpenCV-2.?.?-android-sdk -> sdk -> native -> libs -> armeabi-v7a

Project Root -> Your Project -> lib - > armeabi-v7a

压缩lib文件夹并将该zip重命名为whatever-v7a.jar.

复制此.jar文件并将其放在项目中

Project Root -> Your Project -> libs

将此行添加到依赖项部分中的项目build.gradle

compile files('libs/whatever-v7a.jar')

当你现在编译时,你可能会看到你的.apk大约4mb.

(如果你也想支持ARMv6,请重复"armeabi",可能不再需要了.)

第3步 - 将java sdk添加到项目中

从这里复制java文件夹

OpenCV-2.?.?-android-sdk -> sdk

Project Root -> Your Project -> libs (与.jar文件相同的位置);

(您可以将'java'文件夹名称重命名为'OpenCV')

在这个刚刚复制的文件夹中添加一个典型的build.gradle文件; 我用过这个:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

apply plugin: 'android-library'

repositories {
    mavenCentral();
}

android {
    compileSdkVersion 19
    buildToolsVersion "19"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 19
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Project Root settings.gradle文件中,将其更改为如下所示:

include ':Project Name:libs:OpenCV', ':Project Name'

在项目根目录 - >项目名称 - 依赖项部分中的> build.gradle文件中添加以下行:

compile project(':Project Name:libs:OpenCV')

第4步 - 在项目中使用OpenCV

重建,您应该能够导入并开始在项目中使用OpenCV.

import org.opencv.android.OpenCVLoader;
...
if (!OpenCVLoader.initDebug()) {}
Run Code Online (Sandbox Code Playgroud)

我知道这有点像黑客,但我想我还是会发布它.


Ome*_*mez 7

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    maven {
        url 'http://maven2.javacv.googlecode.com/git/'
    }
}

dependencies {
    compile 'com.android.support:support-v4:13.0.+'
    compile 'com.googlecode.javacv:javacv:0.5'
    instrumentTestCompile 'junit:junit:4.4'
}

android {
    compileSdkVersion 14
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 14
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我有用:)

  • 这是用于 javacv(opencv 包装器),现在已更改为“org.bytedeco:javacv:<version>” (2认同)

小智 7

我发布了一篇关于如何使用Android Studio和Gradle构建包含OpenCV的Android NDK应用程序的新帖子.这里可以看到更多信息,我总结了两种方法:

(1)ndk-build在Gradle任务中运行

sourceSets.main.jni.srcDirs = []

task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
    ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
    commandLine "$ndkDir/ndk-build",
            'NDK_PROJECT_PATH=build/intermediates/ndk',
            'NDK_LIBS_OUT=src/main/jniLibs',
            'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
            'NDK_APPLICATION_MK=src/main/jni/Application.mk'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}
Run Code Online (Sandbox Code Playgroud)

(2)ndk-build使用外部工具运行

参数: NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1

这里可以看到更多信息


小智 5

它也适用于Android Studio 1.2 + OpenCV-2.4.11-android-sdk(.zip).

只需执行以下操作:

1)按照以"您可以在Android Studio中轻松完成此操作"开头的答案.按照以下步骤将OpenCV作为库添加到项目中.由TGMCians.

2)修改<yourAppDir>\libraries\opencv你新创建的文件夹build.gradle(TGMCians的答案中的第4步,适用于OpenCV2.4.11-android-sdk并使用gradle 1.1.0):

apply plugin: 'android-library'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'
    }
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 2411
        versionName "2.4.11"
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            aidl.srcDirs = ['src']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3)*.so目录中的文件"armeabi", "armeabi-v7a", "mips", "x86"可以在(默认OpenCV位置)下找到:( ..\OpenCV-2.4.11-android-sdk\OpenCV-android-sdk\sdk\native\libsTGMCians的答案中的步骤9).

享受,如果这有帮助,请给予积极的声誉.我需要50才能直接回答答案(19左):)