如何在使用Gradle时使用opencv?

时间:2013-07-20 23:05:08

标签: android opencv gradle android-gradle

我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在build.gradle上插入OpenCV repo和库。我的.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
    }
}

如何在项目中添加OpenCV?

12 个答案:

答案 0 :(得分:129)

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

按照以下步骤在项目中添加Open CV作为库。

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

  2. 转到SDK“\ OpenCV-2.4.8-android-sdk \ sdk”的位置,在这里找到java文件夹,将其重命名为opencv。< / p>

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

  4. 现在在build.gradle目录中创建一个opencv文件,其中包含以下内容

    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']
            }
        }
    }
    
  5. 在应用程序的主目录中编辑settings.gradle文件并添加以下行:

    include ':libraries:opencv'
    
  6. 将您的项目与Gradle同步,它应该是这样的

    screen 1

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

    enter image description here

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

    enter image description here

  9. jniLibs位置创建一个/app/src/main/文件夹,并在{{1}中复制所有带* .so文件的文件夹(armeabi,armeabi-v7a,mips,x86)来自OpenCV SDK。

    enter image description here

  10. 单击“确定”。现在一切都已完成,去享受OpenCV。

答案 1 :(得分:25)

根据OpenCV文档(1),以下使用 OpenCV管理器的步骤是将OpenCV用于生产运行的推荐方法。但是,OpenCV经理(2)是Google Play商店的额外安装。所以,如果您更喜欢自包含的apk(不使用OpenCV管理器)或者当前处于<​​em>开发/测试阶段,我建议您在https://stackoverflow.com/a/27421494/1180117处回答。

使用OpenCV管理器在Android Studio中使用OpenCV的建议步骤。

  1. 解压缩从OpenCV.org下载的OpenCV Android sdk(3
  2. File -> Import Module,在解压缩的opencv存档中选择sdk/java文件夹。
  3. 在导入的OpenCV模块下更新build.gradle以更新4个字段以匹配项目的build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和4)targetSdkVersion。
  4. Application -> Module Settings添加模块相关性,然后选择Dependencies标签。点击底部(或右侧)的+图标,选择Module Dependency,然后选择导入的OpenCV模块。
  5. 最后一步,在您的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);
        }
    }
    

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

    <强>赞成

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

    缺点

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

答案 2 :(得分:9)

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

步骤1-下载资源

http://opencv.org/downloads.html

下载OpenCV Android SDK

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

复制libopencv_info.so&amp;来自

的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']
        }
    }
}

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

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

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

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

第4步 - 在项目中使用OpenCV

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

import org.opencv.android.OpenCVLoader;
...
if (!OpenCVLoader.initDebug()) {}

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

答案 3 :(得分: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
    }
}

这对我有用:)

答案 4 :(得分:7)

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

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

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
}

(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

可以看到更多信息here

答案 5 :(得分:7)

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

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

dependencies {
  implementation 'com.quickbirdstudios:opencv:3.4.1'
}

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

repositories {
  jcenter()
}

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");
    }
...
...
...
...

答案 6 :(得分: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.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']
        }
    }
}

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

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

答案 7 :(得分:3)

这些是在Android Studio 1.2中使用OpenCV所需的步骤:

  • 下载OpenCV并解压缩档案
  • 在Android Studio中打开您的应用项目
  • 转到文件 - &gt;新 - &gt;导入模块......
  • 之前的目录中选择sdk/java
  • 模块名称设置为opencv
  • 下一步,然后按完成
  • 在导入的OpenCV模块下打开build.gradle,并将compileSdkVersionbuildToolsVersion更新为您计算机上的版本
  • compile project(':opencv')添加到您的app build.gradle

    dependencies {
        ...
        compile project(':opencv')
    }
    
  • 使用Gradle文件同步项目

答案 8 :(得分:2)

我已将OpenCV SDK中的Java项目导入到Android Studio gradle项目中,并在https://github.com/ctodobom/OpenCV-3.1.0-Android

处可用

您可以将它包含在您的项目中,只需在build.gradle文件中添加两行,这要归功于jitpack.io服务。

答案 9 :(得分:2)

OpenCV Android SDK有一个示例gradle.build文件,其中包含有用的评论:https://github.com/opencv/opencv/blob/master/modules/java/android_sdk/build.gradle.in

//
// Notes about integration OpenCV into existed Android Studio application project are below (application 'app' module should exist).
//
// This file is located in <OpenCV-android-sdk>/sdk directory (near 'etc', 'java', 'native' subdirectories)
//
// Add module into Android Studio application project:
//
// - Android Studio way:
//   (will copy almost all OpenCV Android SDK into your project, ~200Mb)
//
//   Import module: Menu -> "File" -> "New" -> "Module" -> "Import Gradle project":
//   Source directory: select this "sdk" directory
//   Module name: ":opencv"
//
// - or attach library module from OpenCV Android SDK
//   (without copying into application project directory, allow to share the same module between projects)
//
//   Edit "settings.gradle" and add these lines:
//
//   def opencvsdk='<path_to_opencv_android_sdk_rootdir>'
//   // You can put declaration above into gradle.properties file instead (including file in HOME directory),
//   // but without 'def' and apostrophe symbols ('): opencvsdk=<path_to_opencv_android_sdk_rootdir>
//   include ':opencv'
//   project(':opencv').projectDir = new File(opencvsdk + '/sdk')
//
//
//
// Add dependency into application module:
//
// - Android Studio way:
//   "Open Module Settings" (F4) -> "Dependencies" tab
//
// - or add "project(':opencv')" dependency into app/build.gradle:
//
//   dependencies {
//       implementation fileTree(dir: 'libs', include: ['*.jar'])
//       ...
//       implementation project(':opencv')
//   }
//
//
//
// Load OpenCV native library before using:
//
// - avoid using of "OpenCVLoader.initAsync()" approach - it is deprecated
//   It may load library with different version (from OpenCV Android Manager, which is installed separatelly on device)
//
// - use "System.loadLibrary("opencv_java3")" or "OpenCVLoader.initDebug()"
//   TODO: Add accurate API to load OpenCV native library
//
//
//
// Native C++ support (necessary to use OpenCV in native code of application only):
//
// - Use find_package() in app/CMakeLists.txt:
//
//   find_package(OpenCV 3.4 REQUIRED java)
//   ...
//   target_link_libraries(native-lib ${OpenCV_LIBRARIES})
//
// - Add "OpenCV_DIR" and enable C++ exceptions/RTTI support via app/build.gradle
//   Documentation about CMake options: https://developer.android.com/ndk/guides/cmake.html
//
//   defaultConfig {
//       ...
//       externalNativeBuild {
//           cmake {
//               cppFlags "-std=c++11 -frtti -fexceptions"
//               arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native/jni" // , "-DANDROID_ARM_NEON=TRUE"
//           }
//       }
//   }
//
// - (optional) Limit/filter ABIs to build ('android' scope of 'app/build.gradle'):
//   Useful information: https://developer.android.com/studio/build/gradle-tips.html (Configure separate APKs per ABI)
//
//   splits {
//       abi {
//           enable true
//           reset()
//           include 'armeabi-v7a' // , 'x86', 'x86_64', 'arm64-v8a'
//           universalApk false
//       }
//   }
//

apply plugin: 'com.android.library'

println "OpenCV: " + project.buildscript.sourceFile

android {
    compileSdkVersion 27
    //buildToolsVersion "27.0.3" // not needed since com.android.tools.build:gradle:3.0.0

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_6
        targetCompatibility JavaVersion.VERSION_1_6
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['native/libs']
            java.srcDirs = ['java/src']
            aidl.srcDirs = ['java/src']
            res.srcDirs = ['java/res']
            manifest.srcFile 'java/AndroidManifest.xml'
        }
    }
}

dependencies {
}

答案 10 :(得分:1)

AndroidManifest.xml文件中需要以下权限和功能,否则您将获得以下对话框

&#34;您的设备似乎不支持相机(或已锁定)。申请将被关闭&#34;

  <uses-permission android:name="android.permission.CAMERA"/>

    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
    <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>

答案 11 :(得分:0)

OpenCV,Android Studio 1.4.1,gradle-experimental插件0.2.1

其他答案都没有帮助我。这对我有用。我正在使用opencv中的tutorial-1示例,但我将在我的项目中使用NDK,因此我使用的gradle-experimental插件与gradle插件的结构不同。

应安装Android工作室,Android NDK应通过Android SDK Manager安装,OpenCV Android SDK应下载并解压缩。

这是一大块bash脚本,以保持其紧凑但完整。它也都在命令行上,因为我遇到的大问题是随着IDE的发展,IDE中的指令已经过时了。

首先设置OpenCV SDK根目录的位置。

export OPENCV_SDK=/home/user/wip/OpenCV-2.4.11-android-sdk
cd $OPENCV_SDK

创建gradle构建文件...

首先是OpenCV库

cat > $OPENCV_SDK/sdk/java/build.gradle <<'==='


apply plugin: 'com.android.model.library'
model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            minSdkVersion.apiLevel = 8
            targetSdkVersion.apiLevel = 23
        }
    }

    android.buildTypes {
        release {
            minifyEnabled = false
        }
        debug{
            minifyEnabled = false
        }
    }
   android.sources {
       main.manifest.source.srcDirs +=  "."
       main.res.source.srcDirs +=  "res"
       main.aidl.source.srcDirs +=  "src"
       main.java.source.srcDirs +=  "src"
   }

}


===

然后告诉教程示例将库标记为什么以及在何处找到它。

cat > $OPENCV_SDK/samples/tutorial-1-camerapreview/settings.gradle <<'==='


include ':openCVLibrary2411'
project(':openCVLibrary2411').projectDir = new File('../../sdk/java')


===

为教程创建构建文件。

cat > $OPENCV_SDK/samples/tutorial-1-camerapreview/build.gradle <<'==='


buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.2.1'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "org.opencv.samples.tutorial1"
            minSdkVersion.apiLevel = 8
            targetSdkVersion.apiLevel = 23
        }
    }

    android.sources {
       main.manifest.source.srcDirs +=  "."
       main.res.source.srcDirs +=  "res"
       main.aidl.source.srcDirs +=  "src"
       main.java.source.srcDirs +=  "src"
    } 

    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
        }
        debug {
             minifyEnabled = false
        }
    }
}

dependencies {
    compile project(':openCVLibrary2411')
}


===

您的构建工具版本需要正确设置。这是一个简单的方法 看看你安装了什么。 (您可以通过安装其他版本 Android SDK Manager)。如果您没有23.0.2,请更改buildToolsVersion。

echo "Your buildToolsVersion is one of: "
ls $ANDROID_HOME/build-tools

将第一行的环境变量更改为版本号

REP=23.0.2 #CHANGE ME
sed -i.bak s/23\.0\.2/${REP}/g $OPENCV_SDK/sdk/java/build.gradle
sed -i.bak s/23\.0\.2/${REP}/g $OPENCV_SDK/samples/tutorial-1-camerapreview/build.gradle

最后,设置正确的gradle包装器。 Gradle需要一个干净的目录 去做这个。

pushd $(mktemp -d)

gradle wrapper --gradle-version 2.5

mv -f gradle* $OPENCV_SDK/samples/tutorial-1-camerapreview
popd

你现在应该全力以赴。您现在可以使用Android Studio浏览到此目录并打开项目。

使用以下命令在命令行上构建tutoral:

./gradlew assembleDebug

它应该构建你的apk,把它放在./build/outputs/apk