在windows平台下编译安卓版本的opencv

时间:2024-04-03 14:03:40

搞了三天,终于搞出来了,耐心解决问题,都会解决的,坚信一切困难都可以克服!!(捂脸笑)

这个版本的opencv库是针对安卓版本进行编译的,可以同时生成动态库和静态库,后续文章也会介绍如何使用编译好的库。

 

 

source: opencv-4.1.1-openvino

contrib: opencv_contrib-4.1.1

 

 

SDK: android-sdk

 

ndk:android-ndk-r16-beta1-windows-x86.zip

ndk解压之后就可以了

官网链接:https://www.androiddevtools.cn/

备注:我刚开始在android studio 上sdk manager管理器中的sdk tools下安装的ndk,

最新版本是ndk-r20,但是在编译过程中总是提示ndk是invalid,后在官网下载了r16版本ok

 

cmake: https://cmake.org/download/

需要配置环境变量E:\Program Files\CMake\bin

 

MinGW: https://sourceforge.net/projects/mingw/files/

同样要配置好环境变量E:\MinGW\bin。cmd输入gcc  -v检查是否安装配置成功。

MinGW是windows平台下编译必须的插件

 

Ant: The apache ant project http://ant.apache.org/

选择Download-Binary Distributions 我选择了apache-ant-1.10.1-bin.zip版本

环境变量: ANT_HOME E:\apache-ant-1.10.1

CLASSPATH E:\apache-ant-1.10.1\lib

PATH E:\apache-ant-1.10.1\bin

 

准备工作完成

 

 

开始编译

step1. 打开cmake gui 配置目录

在windows平台下编译安卓版本的opencv

 

 

add entry增加变量:

NAME=ANDROID_ABI TYPE=STRING VALUE=armeabi

NAME=ANDROID_NDK TYPE=PATH VALUE=F:/android/android-ndk-r16-beta1-windows-x86

配置完点击configure

第一次会提示选择编译器,选择MinGW,交叉编译,下一步选择文件路径:

opencv的sources/platforms/android/android.toolchain.cmake

 

点击finish。

等待几分钟,出现下面图示表示ok

在windows平台下编译安卓版本的opencv

 

查看java包是否打包进去:

java wrappers yes, 当为no时,需要把world项去掉,把java项都勾上

 

在windows平台下编译安卓版本的opencv

 

在windows平台下编译安卓版本的opencv

点击configure

 

step2. 编译opencv-contrib

搜索OPENCV_EXTRA_MODULES_PATH把我们的opencv_contrib/modules的路径添加进去

在windows平台下编译安卓版本的opencv

 

点击generate完成

在windows平台下编译安卓版本的opencv

 

step3. 编译

打开cmd,进去一开始选择的输出编译目录

输入mingw32-make,等待编译,出现下图则表示编译ok

在windows平台下编译安卓版本的opencv

 

在这一步容易出现问题,可以参考以下文章进行修改,避免花费更过时间:

https://github.com/opencv/opencv/issues/8460

https://answers.opencv.org/question/179297/how-to-build-opencv-for-android-using-visual-studio/

 

下面是我自己出错后的解决办法:

在这一步出现了问题,提示opencv\modules\core\src\utils\logtagconfigparser.cpp:301:16:error: 'to_string' is not a member of 'std' 编译失败

说明当前cmake不支持c++11

尝试一:在android.toolchain.cmake文件中修改使得cmake支持c++11

在文件结尾加入:

SET(CMAKE_C_COMPILER g++)

add_compile_options(-std=c++11)

失败

尝试二:在cmake_minimum_required( VERSION 2.6.3 )下增加SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

失败

尝试三:自己写一个 std::to_string() 替换标准库中的

首先写一个 stdtostring.h 文件:

  1. #ifndef STDTOSTRING_H
  2. #define STDTOSTRING_H
  3. #include <string>
  4. #include <sstream>
  5.  
  6. using namespace std;
  7. namespace std
  8. {
  9. template < typename T > std::string to_string( const T& n )
  10. {
  11. std::ostringstream stm ;
  12. stm << n ;
  13. return stm.str() ;
  14. }
  15. }
  16. #endif

然后在需要使用 std::to_stirng() 方法的源文件中包含它:

#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID #include "stdtostring.h" #endif

我是直接在opencv\modules\core\src\utils\logtagconfigparser.cpp文件顶部加入include "stdtostring.h" to_string问题解决

 

也可以尝试增加变量ENABLE_CXX11 BOOL 勾选

 

 

到了95%又挂了。。。

modules\video\src\dis_flow.cpp:442:106: error: 'log2' was not declared in this scope

return std::max(0, (int)std::floor(log2((2.0f*(float)img_width) / ((float)fratio * (float)patch_size))));

据资料显示,android不支持log2(x),所以log2(x)=log(x)/log(2)

 

好吧,97%又挂了。。。

The "android" conmmand is deprecated.

...

Invalid or unsupported command "--silent creat lib-project --path "E:\build-opencv-for-android-4.1.1\armeabi-v7a\android_sdk" --target "ANDROID_SDK_COMPATIBLE_TARGET-NOTFOUND" --name OpenCV --package org.opencv"

Supported commands are:

android list target

android list avd

android list device

android move avd

androi list sdk

android update sdk

modules\java\android_sdk\CMakeFiles\opencv_java_android.dir\build.make:83: recipe for target 'android_sdk/build.xml' failed

新版的SDK tools中的android命令已经不支持 android create project等命令

在Android Studio官网的sdkmanager页面中,明确提到了在Android SDK Tools25.2.3及以后提供了sdkmanager command-line tools 以及舍弃android命令.

为了继续编译opencv-Android,我们使用版本低于25.2.3的android SDK Tools

我这里使用了android-sdk_r24.2-windows.zip下载完成后解压,复制其中的tools目录,将原来的tools目录改名为tools1,拷贝到其位置。

同时下载platform-tools-r22-windows,解压并复制其中的platform-tools目录,将原来的platform-tools改名为platform-tools1,拷贝到其位置

 

error仍然存在:

modules\java\android_sdk\CMakeFiles\opencv_java_android.dir\build.make:83: recipe for target 'android_sdk/build.xml' failed

但是“The "android" conmmand is deprecated. ...”不提示了

 

删除build文件夹内所有内容(修改tools文件夹后必须这么操作),重新来一遍:依旧错误

取消BUILD_TESTS, BUILD_PERF_TESTS选项,重新configure:成功了!!!

 

 

 

step4. 打包, 输入mingw32-make install

完成之后,可以在这个目录下的install文件夹下拿到编译好的东西

在windows平台下编译安卓版本的opencv

 

以上是“armeabi”平台的库文件

按照以上步骤可以编译出“armeabi-v7a”版本的库文件

所有工作完成后,合并install/sdk/native/目录即可。

 

在官方opencv-android-sdk.zip下分别编译了四个平台的库文件:

在windows平台下编译安卓版本的opencv

 

后续如果需要哪个平台的库文件,再按照上述步骤编译就是了!