通过Android Studio上的CMake将OpenCV添加到本机C代码 [英] Adding OpenCV to Native C code through CMake on Android Studio

查看:118
本文介绍了通过Android Studio上的CMake将OpenCV添加到本机C代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过Cmake将Opencv包含到我的android studio项目中的本机C代码中.我在线进行了一些研究,然后从网上下载了FindOpenCV.cmake文件,并将其添加到了我的android项目的应用目录中.这也是CMakeLists.txt所在的位置.我使用此教程将OpenCV作为模块导入到我的Android Studio项目中:

I am trying to include Opencv to my native C code in an android studio project through Cmake. I did some research online and downloaded the FindOpenCV.cmake file from online and added it to the app directory of my android project. This is also where the CMakeLists.txt is located. I imported OpenCV onto my Android Studio project as a module using this tutorial: https://www.learn2crack.com/2016/03/setup-opencv-sdk-android-studio.html, and when I run:

if(!OpenCVLoader.initDebug()){
   System.out.println("Opencv not loaded");
} else {
   System.out.println("Opencv loaded");
}

我知道Opencv已加载.

I get that Opencv is loaded.

但是,由于我试图将OpenCV添加到我的本机代码中,而不是Java代码中,所以我认为我不能使用它.这是我现在拥有的CMakeList:

However, since I'm trying to add OpenCV to my native code, and not the Java code, I don't think I can use this. Here is the CMakeLists I have right now:

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} FindOpenCV.cmake)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library(# Specifies the name of the library.
        apriltag

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/apriltag/apriltag.c
        src/main/apriltag/apriltag_jni.c
        src/main/apriltag/apriltag_quad_thresh.c
        src/main/apriltag/common/g2d.c
        src/main/apriltag/common/getopt.c
        src/main/apriltag/common/homography.c
        src/main/apriltag/common/image_f32.c
        src/main/apriltag/common/image_u8.c
        src/main/apriltag/common/image_u8x3.c
        src/main/apriltag/common/matd.c
        src/main/apriltag/common/pnm.c
        src/main/apriltag/common/string_util.c
        src/main/apriltag/common/svd22.c
        src/main/apriltag/common/time_util.c
        src/main/apriltag/common/unionfind.c
        src/main/apriltag/common/workerpool.c
        src/main/apriltag/common/zarray.c
        src/main/apriltag/common/zhash.c
        src/main/apriltag/common/zmaxheap.c
        src/main/apriltag/tag16h5.c
        src/main/apriltag/tag25h7.c
        src/main/apriltag/tag25h9.c
        src/main/apriltag/tag36artoolkit.c
        src/main/apriltag/tag36h10.c
        src/main/apriltag/tag36h11.c
        )

STRING(REPLACE "-O0" "-O4" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
STRING(REPLACE "-O2" "-O4" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})

include_directories(src/main/apriltag/)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(OpenCV REQUIRED)

find_library(log-lib log)
find_library(jnigraphics-lib jnigraphics)
target_link_libraries(apriltag ${log-lib} ${jnigraphics-lib})

这是我在构建gradle时遇到的错误:

Here are the errors I'm getting while building the gradle:

By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has 
asked CMake to find a package configuration file provided by "OpenCV", but 
CMake did not find one. 
Could not find a package configuration file provided by "OpenCV" with any of 
the following names:
OpenCVConfig.cmake
opencv-config.cmake
Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set 
"OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" 
provides a separate development package or SDK, be sure it has been 
installed.

所以我的问题是:

  1. 我可以使用导入的OpenCV还是必须下载其他opencv并将其存储在其他位置?
  2. 要创建gradle,我需要在CMakeLists.txt中进行哪些更改?

理想情况下,我想构建并能够将#include <opencv2/opencv.hpp>using namespace cv添加到我的c文件中,并添加使用opencv函数的函数.

Ideally, I want to build and be able to add #include <opencv2/opencv.hpp> and using namespace cv to my c file and add functions that use opencv functions.

感谢您的帮助!

推荐答案

19年10月21日更新:不推荐使用Git/简单方法,而推荐使用新的AndroidOpenCVGradlePlugin

更新18年5月22日:添加了缺少的第6步.

更新17年5月10日:新解决方案使用CMake和Android Gradle插件2.3.1将OpenCV正确集成到应用程序中.使用Android Studio 2.3.1进行了测试.

更新17年5月11日:提供了其他解决方案

包含OpenCV的方法有两种.

There are two ways of including OpenCV.

使用AndroidOpenCVGradlePlugin

访问 https://github.com/ahasbini/AndroidOpenCVGradlePlugin 了解更多信息.

Git/简单方式

访问 https://github. com/ahasbini/Android-OpenCV 了解更多详情.

Visit https://github.com/ahasbini/Android-OpenCV for more details.

手动/高级方式

要将OpenCV库包含到Android Studio项目中,最好在项目中创建一个新的库模块,并将来自OpenCV Android SDK捆绑包的文件移植到其中:

To include OpenCV libraries into Android Studio Project, its best to create a new Library Module in the project and port the files from OpenCV Android SDK bundle into it:

  1. 通过选择文件">新模块"来创建新模块.
  2. 选择"Android库",然后输入详细信息:
    • 库名称:OpenCV
    • 模块名称:opencv
    • 包裹名称:org.opencv
  1. Create a new module by selecting File>New Module.
  2. Select "Android Library", and then enter the details:
    • Library name: OpenCV
    • Module name: opencv
    • Package name: org.opencv


cmake_minimum_required(VERSION 3.4.1)
set(OpenCV_DIR "src/sdk/native/jni")
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")
include_directories(${OpenCV_INCLUDE_DIRS})


  1. opencv模块中,如下编辑build.gradle文件:
  1. Within the opencv module, edit the build.gradle file as such:


...
android {
    ...

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 25
        versionCode 3200
        versionName "3.2.0"

        ...

        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
    }
    buildTypes {
        ...
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets {
        main {
            jni.srcDirs = [jni.srcDirs, 'src/sdk/native/jni/include']
            jniLibs.srcDirs = [jniLibs.srcDirs, 'src/sdk/native/3rdparty/libs', 'src/sdk/native/libs']
        }
    }
}
...


  1. app(应用程序模块,可能是另一个名称)模块中,创建/编辑CMakeLists.txt文件,并按以下顺序添加以下行(请注意将不同的路径设置为OpenCV_DIR):
  1. Within the app (application module, could be another name) module, create/edit CMakeLists.txt file and add the following lines in the following order (Note the different path set to OpenCV_DIR):


set(OpenCV_DIR "../opencv/src/sdk/native/jni")
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")
target_link_libraries(YOUR_TARGET_LIB ${OpenCV_LIBS})


  1. app(应用程序模块,可能是另一个名称)模块中,按如下方式编辑build.gradle文件:
  1. Within the app (application module, could be another name) module, edit the build.gradle file as such:


...    
android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
        }
    }
    buildTypes {
        ...
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    ...
    compile project(':opencv')
}


  1. 进行gradle同步,现在包括OpenCV本机库,头文件和Java包装器类.

在构建项目并启动apk时,您可以在path_to_project/path_to_app_module/build/output/下检查打包的apk(将apk拖到Android Studio的文本编辑器标签上)

When project is built and apk is launched, you could inspect the packaged apk under path_to_project/path_to_app_module/build/output/ (drag the apk onto the text editor tabs of Android Studio)

您应该在每个abi体系结构文件夹下看到一个libopencv_java3.so.

You should see a libopencv_java3.so under each abi architecture folder.

在您的Java类中初始化OpenCV SDK:

Initialize the OpenCV SDK in your java class :

public class MyClass {

    static {
        if (BuildConfig.DEBUG) {
            OpenCVLoader.initDebug();
        }
    }

    ...
}

您应该在logcat消息中看到指定已加载OpenCV的消息(第一个错误是正常的):

And you should see within logcat messages specifying the OpenCV has been loaded (the first error is normal):

05-10 10:42:31.451 D/OpenCV/StaticHelper: Trying to get library list
05-10 10:42:31.452 E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV
05-10 10:42:31.452 D/OpenCV/StaticHelper: Library list: ""
05-10 10:42:31.452 D/OpenCV/StaticHelper: First attempt to load libs
05-10 10:42:31.452 D/OpenCV/StaticHelper: Trying to init OpenCV libs
05-10 10:42:31.452 D/OpenCV/StaticHelper: Trying to load library opencv_java3
05-10 10:42:32.031 D/OpenCV/StaticHelper: Library opencv_java3 loaded
05-10 10:42:32.031 D/OpenCV/StaticHelper: First attempt to load libs is OK
05-10 10:42:32.045 I/OpenCV/StaticHelper: General configuration for OpenCV 3.2.0 =====================================
05-10 10:42:32.045 I/OpenCV/StaticHelper:   Version control:               3.2.0
05-10 10:42:32.045 I/OpenCV/StaticHelper:   Platform:
05-10 10:42:32.045 I/OpenCV/StaticHelper:     Timestamp:                   2016-12-23T13:04:49Z
05-10 10:42:32.045 I/OpenCV/StaticHelper:     Host:                        Linux 4.8.0-25-generic x86_64
05-10 10:42:32.045 I/OpenCV/StaticHelper:     Target:                      Linux 1 x86_64
05-10 10:42:32.045 I/OpenCV/StaticHelper:     CMake:                       2.8.12.2
05-10 10:42:32.045 I/OpenCV/StaticHelper:     CMake generator:             Ninja
05-10 10:42:32.045 I/OpenCV/StaticHelper:     CMake build tool:            /usr/bin/ninja
05-10 10:42:32.045 I/OpenCV/StaticHelper:     Configuration:               Release
05-10 10:42:32.045 I/OpenCV/StaticHelper:   C/C++:
05-10 10:42:32.045 I/OpenCV/StaticHelper:     Built as dynamic libs?:      NO
05-10 10:42:32.045 I/OpenCV/StaticHelper:     C++ Compiler:                /usr/bin/ccache /opt/android/android-ndk-r10e/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-g++ (ver 4.9)

这篇关于通过Android Studio上的CMake将OpenCV添加到本机C代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆