Android Studio 3.2.1 导入OpenCV 3.4.3搭建记录

OpenCV是一款Intel主导开发的计算机视觉库,凭着C++优良的性能、丰富的算法在码农界深受好评,它的功能往低了说可以通过矩阵的方式(线性算法)对图片进行一些处理,比如颜色、形变等等各种仿射变换,往大了说它可以做机器视觉学习,它自带DNN(深度神经网络)、SVM(支持向量机)、Boost等等机器学习算法,可以做文字、图形等分类和识别等较为复杂的需求,得到了业界广泛好评。

由于之前有一点关于图像处理的一点需求,所以在这里记录一下在Android Studio搭建过程。

  • 操作系统:任意
  • IDE、SDK:Android Studio with SDK ,API 25+.
  • NDK: 10+

首先我们去下载:
https://opencv.org/releases.html
Android Studio 3.2.1 导入OpenCV 3.4.3搭建记录_第1张图片
在这里我们选择Android Pack。如果读者会在Windows上进行一定的实验,那么WinPack也可以下载下来在VS里搭建开发环境,并且Win Pack里包含了完整源码,可以自行跨平台编译。
我们只需要Android Pack。
下载完毕后我们需要对其进行解压操作:

unzip opencv-3.4.3-android-sdk.zip

解压完成后可以看到我们的OpenCV目录下:

OpenCV-android-sdk
Android Studio 3.2.1 导入OpenCV 3.4.3搭建记录_第2张图片
我们可以导入sdk目录到Android Studio 3.2.1中,作为现有Project的一个Module。

启动Android Studio,新建一个项目(C++支持可有可无,不过将来可能用到)后在当前项目Syncing完成后,需要导入sdk目录作为一个依赖模块,执行步骤如下:
Import module: Menu -> “File” -> “New” -> “Module” -> “Import Gradle project”。
将我们的sdk目录导入,并且module更名为:sdk(官方build.gradle中推荐用:opencv,但是一旦用find_package在CMakeLists.mk中为C++引用库,那么就会出现错误,所以还是使用:sdk)。
Finish。
此时我们的OpenCV就导入到Project当中来了。Sync过程会发生失败。

而排除这个失败的原因的过程很讨厌。我们都知道,Sync过程失败多数需要检查build.gradle配置是否存在问题,否则需要检查idea.log文件去看一下gradle同步构建过程中发生了什么细节错误问题。偏偏在这个过程,没有显示任何异常
Android Studio 3.2.1 导入OpenCV 3.4.3搭建记录_第3张图片检查了build.gradle并无问题,但是这个同步错误每次Try again都会立即通知出错。从过去的经验来说,只要gradle下载了正确的版本,使用了对应的android gradle plugins, 不缺少必要的依赖, 网络连接正常,且能正常下载依赖库,是不会出现这种问题的。即便出现问题,也应该在Build输出窗格中显示失败描述。
Android Studio 3.2.1 导入OpenCV 3.4.3搭建记录_第4张图片
经过检查,发现要么仍然是SUCCESSFUL,要么什么也不输出,并没有发现任何出错的描述。
因此无法确定出现问题的Task是哪一个Task。所以通过错误信息寻找错误出处无从查起。

解决过程:

通过新建一个Module将必要的文件从:opencv逐个复制过去,并且每次尝试Sync build之后,发现了问题所在。
问题出现在opencv\java\AndroidManifest.xml 清单文件中。
OpenCV提供的该文件,由于是Eclipse格式的项目目录,因此AndroidManifest.xml文件也保持了旧的模版。
如下


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.opencv"
     android:versionCode="3430"
     android:versionName="3.4.3">

   <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" />
manifest>

而新的Build Tools 从某个版本开始,便不再支持在清单文件中描述支持的最低版本和目标sdk版本,又在某个Build Tools版本中执行构建过程时,遇到该文件时报了一个错误,但是却没有输出任何有关这个错误的信息。事实上就是

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" />

这个节点不再有效,必须删除。最后要在文件中保留的只有根节点:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.opencv"
     android:versionCode="3430"
     android:versionName="3.4.3">
manifest>

即可。
删除之后重新同步项目,我们发现现在项目可以正常使用了。

增加C++依赖支持

为了让我们项目同时也能使用C++来开发OpenCV,我们可以继续在原项目上做一定的修改。
首先:
1、(这是可选步骤)我们将app/CMakeLists.txt文件移动到app/src/main/cpp/CMakeLists.txt,并且在app/build.gradle中修改

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }

2、然后在我们的CMakeLists.txt中增加几句话:

find_package(OpenCV  3.4 REQUIRED java)

#include进来的是头文件的目录,最好是相对于当前项目目录,由于我把
#app/CMakeList.txt挪到了src/main/cpp目录中,因此这里要向上四层目录后找sdk目录
include_directories(../../../../sdk/native/jni/include)

target_link_libraries(native-lib ${OpenCV_LIBRARIES})

3、在app/build.gradle中增加:

defaultConfig{
	//这里不得不获得其OpenCV的SDK所在的绝对目录作为-D附带的OpenCV_DIR宏定义传入,告知OpenCV_DIR给CMake模块,告知所在目录
	def opencvsdkRoot = rootProject.file("sdk").absolutePath
	println("opencv module located in: [" + opencvsdkRoot + "]")
	def opencvFlags = "-DOpenCV_DIR=" + opencvsdkRoot + "/native/jni"
	println("OpenCV Config: ${opencvFlags}")
	externalNativeBuild {
	    cmake {
	        cppFlags "-std=c++11 -frtti -fexceptions"
	        arguments opencvFlags, "-DANDROID_ARM_NEON=TRUE" //如有性能要求,可启用NEON
	        ndk {
	            abiFilters "armeabi-v7a","x86" //根据需求适当增减,仅给出推荐
	        }
	    }
	}
}
dependencies {
	//引入opencv模块作为依赖引用
    implementation project(':sdk')
}

defaultConfig块中。
最后同步。

你可能感兴趣的:(android,OpenCV)