android平台下opencv的编译--包含扩展模块

由于项目需要使用安卓平台下opencv的扩展库,对于通用的opencv库, opencv官网提供了android的SDK

但未能提供扩展库,因此需要自己进行源码编译。本文记录android平台下opencv及其扩展库的交叉编译。

前提:主机已安装android-ndk交叉编译器

安装依赖环境

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config

1、源码下载

下载opencv,可手动下载源码和拓展模块源码,解压后分别命名opencv和opencv_contrib文件

Releases - OpenCV

GitHub - opencv/opencv at 4.8.0

GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modules

2、源码编译

设置编译脚本build-opencv-for-android.sh

#!/bin/bash
NDK_ROOT="${1:-${ANDROID_NDK_HOME}}"
SHELL_PATH=$(pwd)echo $NDK_ROOT### ABIs setup
declare -a ANDROID_ABI_LIST=("arm64-v8a")### path setup
INSTALL_DIR="${SHELL_PATH}/android_opencv"
rm -rf "${INSTALL_DIR}/opencv"### Make each ABI target iteratly and sequentially
API_LEVEL=21
for i in "${ANDROID_ABI_LIST[@]}"
doANDROID_ABI="${i}"echo "Start building ${ANDROID_ABI} version"TEMP_BUILD_DIR="${SHELL_PATH}/build/android_${ANDROID_ABI}"# ### Remove the build folder first, and create itrm -rf "${TEMP_BUILD_DIR}"mkdir -p "${TEMP_BUILD_DIR}"cd "${TEMP_BUILD_DIR}"OPENCV_PATH="${SHELL_PATH}/opencv"OPENCV_CONTRIB_PATH="${SHELL_PATH}/opencv_contrib"INSTALL_PATH=${SHELL_PATH}/out/mkdir -p "${INSTALL_PATH}"/usr/cmake-3.23.0-rc2-linux-x86_64/bin/cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \-DCMAKE_TOOLCHAIN_FILE="${NDK_ROOT}/build/cmake/android.toolchain.cmake" \-DANDROID_TOOLCHAIN=clang++ \-DANDROID_NDK="${NDK_ROOT}" \-DANDROID_NATIVE_API_LEVEL=${API_LEVEL} \-DANDROID_ABI="${ANDROID_ABI}" \-DOPENCV_EXTRA_MODULES_PATH=${OPENCV_CONTRIB_PATH}/modules \-DCMAKE_INSTALL_PREFIX=${INSTALL_PATH} \-D BUILD_ANDROID_PROJECTS=OFF\-D WITH_CUDA=OFF \-D WITH_MATLAB=OFF \-D BUILD_ANDROID_EXAMPLES=ON \-D BUILD_DOCS=OFF \-D BUILD_PERF_TESTS=OFF \-D BUILD_TESTS=OFF \${OPENCV_PATH}# # Build itmake -j4# # Install itmake install/strip# ### Remove temp build foldercd "${SHELL_PATH}"# rm -rf "${TEMP_BUILD_DIR}"echo "end building ${INSTALL_PATH} version"
done

将build-opencv-for-android.sh、opencv和opencv_contrib文件放置于同一目录下

导出NDK安装路径环境变量

export ANDROID_HOME=/usr/android-ndk-r25c/
export ANDROID_NDK_HOME=/usr/android-ndk-r25c/
./build-opencv-for-android.sh

等待编译完成,完成后,编译成功如下,库文件在 ./out/sdk/native/staticlibs/

本文在编译脚本中只设置了安卓arm64-v8a硬件平台的编译,如有需要可自行修改。

问题:编译完成后,不知道为什么,编译没有报错,但在3rdparty目录下并未编译 libtbb.a,可直接使用将官网sdk中的libtbb.a。

参考

GitHub - ShikinChen/build-opencv-for-android: 编译opencv的Android库的脚本

GitHub - tzutalin/build-opencv-for-android: An interactive script to download and build OpenCV and OpenCV contrib for Android

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

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

相关文章

如何升级node.js版本

升级Node.js可以通过多种方式来完成,以下是四种常见的方法: 方法一:使用Node.js官方安装程序 访问Node.js的官方网站,下载对应你操作系统的最新版本安装程序。通常,你可以 https://nodejs.org/en/download 找到你需…

Java 中文官方教程 2022 版(二)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html 运算符 原文:docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html 现在你已经学会了如何声明和初始化变量,你可能想知道如何对其进行操作。学习 Java 编程语言的运…

已知私钥和密文,如何用python进行RSA解密

要使用Python进行RSA解密,你可以使用pycryptodome库。下面是一个简单的示例,展示了如何使用已知的私钥和密文进行RSA解密: 首先,确保你已经安装了pycryptodome库。如果没有安装,你可以通过运行pip install pycryptodome来安装它。 然后,你可以使用以下代码进行RSA解密:…

玩美移动珠宝虚拟试戴解决方案引入glTF 2.0格式支持

领先的AIAR美妆和时尚科技解决方案提供商,以及"美丽AI"解决方案开发商 — 玩美移动于今日宣布,其AI珠宝虚拟试戴解决方案升级版本,性能得以显著提升。通过此次更新,玩美移动系统现可支持glTF 2.0(图形库传输…

启明智显技术分享|ESP32-C3助力Model 3C芯片86盒彩屏开发板实现3MB波特率OTA程序升级和单独图片升级

在物联网快速发展的今天,彩屏显示作为人机交互的重要一环,其显示效果和升级便利性成为了衡量产品竞争力的关键指标。而Model 3C(以下简称M3C芯片)与ESP32-C3的结合,无疑为物联网彩屏领域应用奠定了坚实的基石。 M3C芯片 是启明智…

随机梯度下降算法

随机梯度下降(SGD)是一种优化算法,广泛用于机器学习和深度学习领域中模型的训练。它是梯度下降算法的一个变体,特别适用于大规模数据集。以下是详细学习SGD的步骤,包括理论学习和一个简单的示例实践: 1. 理…

Linux C++ 032-STL之map、multimap容器

Linux C 032-STL之map、multimap容器 本节关键字:Linux、C、map、multimap 相关库函数:clear、insert、erase map基本概念 简介: map中所有元素都是pair pair中第一个元素为key(键值),起到索引作用&…

Promise的介绍及使用教程

什么是Promise? Promise 是ES6引入的一种异步编程解决方案,它代表了一个异步操作的最终完成(或失败)及其结果值。 一个 Promise 在生命周期中有三种状态: Pending(进行中):初始状…

分页的实现方法索引知识

目录 一. SpringBoot项目如何实现分页功能? 二、java中常用的分页插件有哪些 三、pageHelper分页原理及具体实现示例代码? 四、在MyBatis-Plus中如何实现自定义分页查询? 五、自定义排序在MyBatis-Plus中应该如何实现? 六、…

碳视野 | 今后五年国家重点支持三类双碳项目!

一、政策背景 4月8日,国家发展改革委印发《节能降碳中央预算内投资专项管理办法》(以下简称《办法》),明确了专项资金重点支持范围和标准,重点支持重点行业和重点领域节能降碳、循环经济助力降碳等方向,重点支持内容包…

vue开发过程中,修改了数据,但是页面不渲染,没变化!怎么办?

在做项目中遇到一个问题 对某个参数赋值成功后页面中没有改变 经过多方查阅终于解决这个问题 跟大家分享一下 希望可以帮到你 方法1(推荐):用JSON.parse(JSON.stringify(objectOrArray)) 通常是某个渲染的数组改变了层级较深的数据导致页面…

学习ddd(一)-- 领域驱动设计相关概念

我之前一直对领域驱动设计(DDD)相关的知识有零散的认识,没有系统性地学习过。最近抽空系统地学习了一下,发现这块知识比较抽象,很难读懂。加上我自己的理解,我整理了一些知识,希望能够分享给大家 第一期先讲些了DDD的一些基础概念 充血模型 在我们以往的开发模式中,…

Seata框架实现分布式事务(一)CAP理论

1、什么是事务 事务是指一系列数据库操作,它们被看作是一个逻辑单元,并且要么全部成功地执行,要么全部失败地回滚到初始状态,以确保数据的一致性和完整性。事务具有以下四个特性,通常被称为 ACID 特性: 所…

VMware安装kylin系统

安装成功画面 1.点击如下链接,下载iso镜像 openKylin开源操作系统 选择图片中的镜像进行下载 此处一定要选择稍后安装系统

基于springboot+vue框架实现的环保网站+文档+免费远程调试

项目介绍; 基于java(springboot)框架实现的环保网站 系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下。 前台功能: 1.首页:展示环保网站的最新动态、重要公告等信息。 2.濒危生物:提供濒危生物的相关信息以及保护措施。 3.…

unity获取所有子物体位置,再把获取到的位置重新随机分配给子物体(不含父物体)

unity获取所有子物体位置&#xff0c;再把获取到的位置重新随机分配给子物体&#xff08;不含父物体&#xff09; /// <summary> /// 给所有子物体随机分配位置 /// </summary> void RandomLocation() {// 获取当前物体下的所有子物体Transform[] childTransforms…

学习笔记——一些数据转换脚本(Python)

目录 文章目录 目录学习笔记——一些数据转换脚本&#xff08;Python&#xff09;json2YOLO&#xff08;txt&#xff09;VOC&#xff08;xml&#xff09;2YOLO&#xff08;txt&#xff09;image2h5json2npz 学习笔记——一些数据转换脚本&#xff08;Python&#xff09; 注&…

洛谷【入门1】顺序结构

洛谷【入门1】顺序结构 Hello,World!题目描述样例 #1样例输入 #1样例输出 #1 输出字符菱形题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 超级玛丽游戏题目背景题目描述输入格式输出格式 AB Problem题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 字…

C语言经典例题(23) --- 2的n次方计算、按照格式输入并交换输出、字符转ASCII码、计算机表达式的值、计算带余除法

文章目录 1.2的n次方计算2.按照格式输入并交换输出3.字符转ASCII码4.计算机表达式的值5.计算带余除法 1.2的n次方计算 题目描述&#xff1a; 不用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 输入描述: 多组输入&#x…

常用特征分箱算法

特征分箱是构建信用评分过程中最重要的一个环节。特征分箱是对连续变量离散化的一种简称&#xff0c;对于连续型变量&#xff0c;需要对其连续值进行拆分&#xff0c;并进行后续的分箱调整工作&#xff1b; 对于离散型变量&#xff0c;通常要根据每个离散值计算其坏样本占比或…