Linux 混合编译opencv与opencv_contrib的android版本

 一、该方法只能编译.a文件

使用该脚本:https://github.com/tzutalin/build-opencv-for-android

1 $ git clone https://github.com/tzutalin/build-opencv-for-android.git
2 $ cd build-opencv-for-android
3 $ ./setup.sh 3.3.1

而后配置android ndk的路径

export ANDROID_NDK=./

而后运行脚本即可

./build-android-opencv.sh

 二、可同时编译.a和.so

编译环境准备

  1. OpenCV 3.1.0源码(假定目录为<opencv-souce>)
  2. OpenCV_contrib 3.1.0源码(假定目录为<opencv-contrib>)
  3. cmake-gui 3.8.2 cmake的GUI工具
  4. Mingw 编译工具(假定目录为<mingw-dir>)
  5. Android NDK r12b 或者最新(假定目录为<ndk-dir>)
  6. Android SDK >=19(假定目录为<sdk-dir>)
  7. Android Studio
  8. Java ANT 1.9.9(假定目录为<ant-dir>)

以上你是需要准备编译的基础环境,下面分别讲解一下:
1.OpenCV源码

1
2
3
cd <opencv-source>;
git clone https://github.com/opencv/opencv.git
git checkout -b "3.1.0" "3.1.0"

 

2.OpenCV_contrib源码

1
2
3
cd <opencv-contrib>;
git clone https://github.com/opencv/opencv-contrib.git
git checkout -b "3.1.0" "3.1.0"

 

PS> 注意我们看到这里我采用的是opencv和opencv_contrib的3.1.0版本,主要的原因是opencv3.0.0和
3.2.0在实践中会遇到各种莫名其妙的原因,很难进行下去(比如opencv3.2.0目前还很难用mingw编译),这一块的摸索花了我大量的时间,所以我建议你也统一使用3.1.0版本。

3.cmake-gui工具
去到cmake官网下载3.8.2版本的cmake-64位工具:https://cmake.org/files/v3.8/cmake-3.8.2-win64-x64.msi

4.MinGW
MinGW是Windows下的GCC编译工具,去到Sourceforge下载MinGW的管理工具mingw-get-setup.exe。配置mingw的目录为<mingw-dir>,并将<mingw-dir/bin>添加进系统变量。

PS> 注意你可以选择mingw32或者mingw64都是可以的。我后续采用的是mingw32。也就是安装选项中的:
mingw32

5.Android NDK
NDK的官方介绍是:

Android NDK 是一套允许您使用原生代码语言(例如 C 和 C++)实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码库。

你可以去下载最新64位稳定版本:android-ndk-r14b-windows-x86_64.zip

当然由于历史原因我选择的是android-ndk-r12b-windows-x86_64.zip

下载后解压开即可。解压目录为<ndk-dir>。

6&7. Android SDK和Android Studio就不必说了,注意SDK的版本安装全一点,从API_LEVEL=19以上的都下了最好。其中SDK的目录为<sdk-dir>。

8.JAVA ANT 1.9.9
在编译OpenCV for JAVA起到关键作用。下载地址:http://apache.fayea.com//ant/binaries/apache-ant-1.9.9-bin.zip。 相应解压目录为<ant-dir>。

编译配置

  1. 去到 <opencv-source> 中,创建<opencv-source>/platforms/android_arm
  2. 双击打开”cmake-gui.exe”
  3. 在”where is th source code”填入<opencv-source>目录
  4. 在”where to build the binaries”填入<opencv-source>/platforms/android_arm
  5. 点击”Add Entry”,添加”ANDROID_NDK”,并设定为”PATH”类目,对应目录为<nkd-dir>,在我的电脑上就是”F:\Android\android-ndk-r10e”
    1. android-ndk-setting
    2. 点击”Add Entry”,添加”ANDROID_NDK_HOST_X64”,并设定为”BOOL”类目,点击勾选。这是因为我们的NDK是64位版本的,如果你的NDK是32位的,则不需要勾选
      android-ndk-setting-2
    3. 点击”Add Entry”,添加”CMAKE_TOOLCHAIN_FILE”,并设定为”FILEPATH”类目,设置路径为<opencv-source>/platforms/android/android.toolchain.cmake
      android-ndk-setting-3
    4. 点击”Add Entry”,添加”CMAKE_BUILD_WITH_INSTALL_RPATH”,并设定为”BOOL”类目,点击勾选
    5. 点击”Add Entry”,添加”ANDROID_SDK”,并设定为”path”类目,设置路径为<sdk-path>
    6. 点击”Add Entry”,添加”ANDROID_ABI”,并设定为”string”类目,设置值为armeabi-v7a。这里的选项也即你需要编译的库类型,如果你想要编译armeabi或者X86都在这个值上修改。我们可以先编译armeabi-v7a
      android-ndk-setting-4
    7. 点击”Add Entry”,添加”ANDROID_NATIVE_API_LEVEL”,并设定为”string”类目,设置值为19。这里的选项也即你需要编译的API-LEVEL,我定的是19,你也可以用20或者21
    8. 点击”Configure”,选择”MinGW Makefile”作为编译选项,并在接下来的选项中选择”Specify toolchain file for cross-compiling”,点击”Next”,对应的路径选择<opencv-source>/platforms/android/android.toolchain.cmake,点击”Finish”

    MinGW交叉编译配置
    MinGW交叉编译配置

    等待configure完成,如下图所示:
    cmake-configure-1

    我们接着添加opencv-contrib模块,搜索extra,在OPENCV_EXTRA_MODULES_PATH添加路径<opencv-contrib>/modules

    Configuring done完成后我们还需要进行一些调整:

    1. WITH_CUDA=OFF
    2. WITH_MATLAB=OFF
    3. BUILD_DOCS=OFF
    4. BUILD_PERF_TESTS=OFF
    5. BUILD_TESTS=OFF
    6. WITH_TIFF=OFF
    7. BUILD_opencv_bioinspired=OFF
    8. BUILD_opencv_dnn=OFF(如果你用不到这个的话,建议你禁掉)
    9. BUILD_opencv_structured_light=OFF(我当时添加这个模块时出现了错误,建议你也禁掉)
    10. BUILD_opencv_ximgproc=OFF(我当时添加这个模块时出现了错误,建议你也禁掉)
    11. BUILD_opencv_world:BOOL=OFF (不用尝试编译opencv_world了,从我的经验来看是编译不出来)
    12. BUILD_opencv_contrib_world:BOOL=OFF (同上)

ANT_EXECUTABLE=<ant-dir>/bin/ant.bat

上诉设定调整好后,再次点击configure后再点击generate,显示:

Configuring done
Generating done

执行编译

在上述编译配置完成后,通过命令行工具进入<opencv-source>/platforms/android_arm目录,执行

1
mingw32-make -j4

即可开始编译
building

 

遇到的问题:

1、ndk和sdk需要选择win64版本

2、报选择API错误,实际是读取ndk中特定api-level中的include文件读取不到,从其他版本的ndk中拷贝即可

转载于:https://www.cnblogs.com/zl1991/p/9285266.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scroll-view 横向滑动无效的问题

在小程序中写一个横向视图&#xff0c;直接用一个scroll-view&#xff0c;加上scroll-x"true"属性就OK了 xml <scroll-view class"wrap" scroll-x"true"><block wx:for"{{[1,2,3,4,5]}}" wx:key"item" wx:for-i…

[vue] 使用vue后怎么针对搜索引擎做SEO优化?

[vue] 使用vue后怎么针对搜索引擎做SEO优化&#xff1f; 1.SSR服务器渲染&#xff1b; 2.静态化&#xff1b; 3.预渲染prerender-spa-plugin&#xff1b; 4.使用Phantomjs针对爬虫做处理个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; …

css3绘制三角形

第一步&#xff1a;新建一个div <div class"san"></div> 第二步&#xff1a;根据三角形方向&#xff0c;为盒子添加样式 1、向上 .san{width:0;height:0;border-right:100px solid transparent;border-left:100px solid transparent;border-bottom:1…

bzoj2683bzoj4066

题解&#xff1a; 前一题不是强制在线&#xff0c;后一题是强制在线 树套树空间会炸 说一下cdq分治树状数组 首先我们利用cdq分治使得查询和操作保证先后关系 然后矩阵查询变成4个矩阵的差 那么我们就可以运用扫描线的方法来维护了 时间nlogn^2,空间O(n) 后一题是kd-tree 查询的…

[vue] 跟keep-alive有关的生命周期是哪些?描述下这些生命周期

[vue] 跟keep-alive有关的生命周期是哪些&#xff1f;描述下这些生命周期 activated和deactivatedkeep-alive的生命周期1.activated&#xff1a; 页面第一次进入的时候&#xff0c;钩子触发的顺序是created->mounted->activated2.deactivated: 页面退出的时候会触发deac…

[vue] 如果现在让你从vue/react/angularjs三个中选择一个,你会选哪个?说说你的理由

[vue] 如果现在让你从vue/react/angularjs三个中选择一个&#xff0c;你会选哪个&#xff1f;说说你的理由 让我选肯定是vue。angularjs没用过。angular倒是用过。挺好用的&#xff0c;但是&#xff01;&#xff01;&#xff01;编译真的很慢&#xff0c;加了热更新还是慢&…

微信小程序 - 用户进入客服会话会在右下角显示可能要发送的小程序提示

起因&#xff0c;看到了抽奖小助手的操作&#xff0c;如下截图 我就想 我去 这个吊啊 很懵逼 因为之前没见过 以为是服务端的操作 看了半天服务端文档并没有相关介绍&#xff0c;在微信社区遨游了半天发现了 原来就是小程序「buttun」组件新增&#xff08;之前看的时候 明明没…

java中boolean类型占几个字节

java的基本数据类型中&#xff0c;boolean只有两种状态&#xff0c;默认值为false.取值范围是{true,false}&#xff0c;理论上占1bit&#xff0c;实际上&#xff1a; 1.单个的boolean 类型变量在编译的时候是使用的int 类型。 boolean atrue;//这个a在JVM中占4个字节即&#xf…

[vue] 你知道vue2.0兼容IE哪个版本以上吗?

[vue] 你知道vue2.0兼容IE哪个版本以上吗&#xff1f; 双向绑定的原理是基于Object,defineProperty的&#xff0c;ie8及以下不兼容这个api。另外还有一些特性至少在ie10才能用&#xff0c;我们已经弃用ie了&#xff0c;所以没继续总结个人简介 我是歌谣&#xff0c;欢迎和大家…

小程序真机测试「启动参数」解析出错问题

写小程序2年了 前两天才碰到的这个问题 以前没出错过 话不多说 直接上图 1、小程序 - 启动参数图例 2 2、微信开发者工具-模拟器输出参数-正常图例 这是没问题&#xff01; 3、真机测试-输出参数-错误图例 也不知道是什么原因 去看了一下文档 「启动参数」传参的规则并没有改…

质数

1117: 质数 时间限制: 1 Sec 内存限制: 128 MB提交: 6 解决: 3[提交][状态][讨论版][命题人:外部导入]题目描述 给定一个长度为N(0< n< 10000)的序列&#xff0c;保证每一个序列中的数字a[i]是小于maxlongint的非负整数 &#xff0c;编程要求求出整个序列中第k大的数字…

[vue] 使用vue开发一个todo小应用,谈下你的思路

[vue] 使用vue开发一个todo小应用&#xff0c;谈下你的思路 结构: 输入部分( input )和输出部分( ul ) 逻辑:用户输入之后,通过事件触发拿到用户输入的数据存起来, 将用户数据集合通过 v-for 渲染到页面上 当用户点击清单项,通过事件触发移出对应事件个人简介 我是歌谣&#…

和的区别

1、都可用作「逻辑与运算符」 &和&&用作「逻辑与运算符」时&#xff0c;当运算符两边的表达式的结果都为true时&#xff0c;整个运算结果才为true&#xff0c;否则&#xff0c;只要有一方为false&#xff0c;则结果为false。在JS中&#xff0c;一共有这几种情况被认…

[vue] 你有看过vue推荐的风格指南吗?列举出你知道的几条

[vue] 你有看过vue推荐的风格指南吗&#xff1f;列举出你知道的几条 优先级A的规则&#xff1a;必要的 &#xff08;规避错误&#xff09;组件名为多个单词组件数据&#xff1a;组件的 data 必须是一个函数。细致的 Prop 定义总是用 :key 配合 v-for避免 v-if 和 v-for 用在一起…

jQuery学习总结06-插件开发

本文是参考了Joey的博客后整理的。 先从一个简单扩展jQuery对象的demo开始说起&#xff1a; //sample:扩展jquery对象的方法&#xff0c;redTextColor()用于改变字体颜色。(function ($) {$.fn.extend({"redTextColor": function () {// 默认字体颜色为红色return th…

js 位运算符 ~, ,| ,^

1、位运算 NOT 由否定号&#xff08;~&#xff09;表示 位运算 NOT 是三步的处理过程&#xff1a; 把运算数转换成 32 位数字把二进制数转换成它的二进制反码把二进制数转换成浮点数 例如&#xff1a; //31位表示整数的数值&#xff0c;用第 32 位表示整数的符号&#xff0c;…

[vue-cli]vue-cli提供了的哪几种脚手架模板?

[vue-vuex]vue-cli提供了的哪几种脚手架模板&#xff1f; vue-cli2.x 好像有个simple和完整版的 vue-cli3.x 提供了自定义装箱配置 可以选装TypeScriptPWAlinte2ecss 预处理routervuex个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但…

DHCP服务器的设计

介绍 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;通常被应用在大型的局域网络环境中&#xff0c;主要作用是集中的管理、分配IP地址&#xff0c;使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息&…

Dom对象、JavaScript对象、jQuery对象区别

一、Dom对象、JavaScript对象、jQuery对象 1.1 Dom对象 文档对象模型简称DOM&#xff0c;是W3C组织推荐的处理可扩展置标语言的标准编程接口。 DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、 这些对象的行为和属性以及这些对象之间的关系。…

[vue-cli] vue-cli工程中常用的npm命令有哪些

[vue-cli] vue-cli工程中常用的npm命令有哪些 npm install&#xff1a;下载 node_modules 资源包的命令 思考问题&#xff1a; 为什么下载资源包要用npm install&#xff1f; 请你谈一下 npm run dev&#xff1a; 启动 vue-cli 开发环境的 npm命令&#xff08;3.0以下&#x1…