在windows平臺下編譯安卓版本的opencv

搞了三天,終於搞出來了,耐心解決問題,都會解決的,堅信一切困難都可以克服!!(捂臉笑)

這個版本的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 配置目錄

 

 

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

 

查看java包是否打包進去:

java wrappers yes, 當爲no時,需要把world項去掉,把java項都勾上

 

 

點擊configure

 

step2. 編譯opencv-contrib

搜索OPENCV_EXTRA_MODULES_PATH把我們的opencv_contrib/modules的路徑添加進去

 

點擊generate完成

 

step3. 編譯

打開cmd,進去一開始選擇的輸出編譯目錄

輸入mingw32-make,等待編譯,出現下圖則表示編譯ok

 

在這一步容易出現問題,可以參考以下文章進行修改,避免花費更過時間:

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文件夾下拿到編譯好的東西

 

以上是“armeabi”平臺的庫文件

按照以上步驟可以編譯出“armeabi-v7a”版本的庫文件

所有工作完成後,合併install/sdk/native/目錄即可。

 

在官方opencv-android-sdk.zip下分別編譯了四個平臺的庫文件:

 

後續如果需要哪個平臺的庫文件,再按照上述步驟編譯就是了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章