Ubuntu 编译 OpenCV SDK for Android + Linux

news2024/11/16 6:41:24

概述

      OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。
  OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。OpenCV 还提供了机器学习模块,你可以使用正态贝叶斯、K最近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。
在这里插入图片描述

OpenCV的应用非常广泛,在AI-新手玩转RKNN一文中虽然并未提及,当在demo、examples中,可以看到很多OpenCV的影子。
比如:

import cv2
img = cv2.imread(IMG_PATH)
#include "opencv2/core/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"

cv::Mat orig_img = cv::imread(image_name, 1);
cv::cvtColor(orig_img, img, cv::COLOR_BGR2RGB);

准备

名称版本备注
系统Ubuntu 20.04
CMAKE3.16.3
NDK版本17.2.4988734Android 系统的C/C++开发SDK
GCC9.4.0Linux 系统的SDK
OpenCV4.7.0

下载OpenCV源码: 4.x.zip, 解压到指定目录
在这里插入图片描述

编译

  1. 创建build并使用cmake 构建目标平台的编译文件
  2. 真正编译make
  3. 安装

将过程简化并写入到脚本方便后续使用:

opencv-4.x/build/build-android.sh

# 一些变量
myDir=$(cd `dirname $0`; pwd)
# Android SDK 路径, 包含了各个版本的SDK 和 NDK
ANDROID_SDK_ROOT=/home/anson/Android/Sdk/
# DNK 路径
ANDROID_NDK_PATH=/home/anson/Android/Sdk/ndk/17.2.4988734/
BUILD_TYPE=Release
TARGET_SOC="rk356x"

# Android的编译会存到: build-rk356x
BUILD_DIR=${myDir}/build-${TARGET_SOC}

if [[ ! -d "${BUILD_DIR}" ]]; then
  mkdir -p ${BUILD_DIR}
fi

# 进入build-rk356x 并执行cmake构建
cd ${BUILD_DIR}
cmake ../.. \
        -DANDROID_TOOLCHAIN=clang \
        -DRKNN_DIR=${RKNN_DIR} \
        -DTARGET_SOC=${TARGET_SOC} \
       	-DCMAKE_SYSTEM_NAME=Android \
        -DANDROID_SDK_ROOT=$ANDROID_SDK_ROOT \
        -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \
        -DANDROID_ABI="arm64-v8a" \
        -DANDROID_STL=c++_static \
        -DANDROID_PLATFORM=android-24 \
        -DBUILD_JAVA=OFF \
        -DWITH_V4L=1 \
        -DHAVE_CAMV4L2=ON \
        -DBUILD_ANDROID_EXAMPLES=OFF \
        -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
# 编译
make -j4
# 输出
make install

PS: 根据需要定制不同的cmake参数
比如需要是用v4l2打开摄像头需要打开: -DWITH_V4L=1 -DHAVE_CAMV4L2=ON


build-linux.sh Linux 的编译脚本相对简单
配置好GCC相关的环境即可

myDir=$(cd `dirname $0`; pwd)

GCC_COMPILER=aarch64-linux-gnu
export CC=${GCC_COMPILER}-gcc
export CXX=${GCC_COMPILER}-g++
BUILD_TYPE=Release
TARGET_SOC="linux"

BUILD_DIR=${myDir}/build-${TARGET_SOC}

if [[ ! -d "${BUILD_DIR}" ]]; then
  mkdir -p ${BUILD_DIR}
fi

cd ${BUILD_DIR}
cmake ../.. \
        -DCMAKE_SYSTEM_NAME=Linux \
        -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
        -DCMAKE_C_COMPILER=$CC \
        -DCMAKE_CXX_COMPILER=$CXX \
        -DCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu/bin \
        -DBUILD_opencv_python2=OFF \
        -DBUILD_opencv_python3=OFF \
        -DENABLE_NEON=ON \
        -DWITH_V4L=1 \
        -DHAVE_CAMV4L2=ON \
        -DCMAKE_INSTALL_PREFIX=${BUILD_DIR}/install \
        -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
make -j4
make install

一些编译的问题
OpenCv4.x + opencv_contrib-4.x交叉编译

#/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: ../../3rdparty/lib/liblibpng.a(pngrtran.c.o): in function `png_do_read_transformations':
#pngrtran.c:(.text.png_do_read_transformations+0x1aec): undefined reference to `png_do_expand_palette_rgba8_neon'
#/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: pngrtran.c:(.text.png_do_read_transformations+0x1ca8): undefined reference to `png_riffle_palette_neon'
#/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: pngrtran.c:(.text.png_do_read_transformations+0x3660): undefined reference to `png_do_expand_palette_rgb8_neon'
#/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: ../../3rdparty/lib/liblibpng.a(pngrutil.c.o): in function `png_read_filter_row':
#pngrutil.c:(.text.png_read_filter_row+0xac): undefined reference to `png_init_filter_functions_neon'
#collect2: error: ld returned 1 exit status
#make[2]: *** [modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/build.make:423: lib/libopencv_imgcodecs.so.4.7.0] Error 1

cmake增加参数: -DENABLE_NEON=ON

使用

OpenCV-Android SDK 输出的文件: build-rk356x/install/sdk

sdk
├── etc
│   ├── haarcascades
│   ├── lbpcascades
│   └── licenses
└── native
    ├── 3rdparty
    │   └── libs
    │       └── arm64-v8a
    ├── jni
    │   ├── abi-arm64-v8a
    │   └── include
    │       └── opencv2
    │           ├── calib3d
    │           ├── core
    │           │   ├── cuda
    │           │   │   └── detail
    │           │   ├── detail
    │           │   ├── hal
    │           │   ├── opencl
    │           │   │   └── runtime
    │           │   │       └── autogenerated
    │           │   ├── parallel
    │           │   │   └── backend
    │           │   └── utils
    │           ├── dnn
    │           │   └── utils
    │           ├── features2d
    │           │   └── hal
    │           ├── flann
    │           ├── gapi
    │           │   ├── cpu
    │           │   ├── fluid
    │           │   ├── gpu
    │           │   ├── infer
    │           │   ├── oak
    │           │   ├── ocl
    │           │   ├── own
    │           │   ├── plaidml
    │           │   ├── python
    │           │   ├── render
    │           │   ├── s11n
    │           │   ├── streaming
    │           │   │   ├── gstreamer
    │           │   │   └── onevpl
    │           │   └── util
    │           ├── highgui
    │           ├── imgcodecs
    │           │   └── legacy
    │           ├── imgproc
    │           │   ├── detail
    │           │   └── hal
    │           ├── ml
    │           ├── objdetect
    │           ├── photo
    │           │   └── legacy
    │           ├── stitching
    │           │   └── detail
    │           ├── video
    │           │   ├── detail
    │           │   └── legacy
    │           └── videoio
    │               └── legacy
    └── staticlibs
        └── arm64-v8a

所有的头文件和lib库已经有了, 只需要在CMakeLists.txt声明对应的变量即可导入使用:

#OPEN_CV_SDK=
# opencv
#Android NDK OpenCVConfig.cmake 所在路径
set(OpenCV_DIR ${OPEN_CV_SDK}/sdk/native/jni/abi-arm64-v8a)
# LINUX OpenCVConfig.cmake 所在路径
set(OpenCV_DIR ${OPEN_CV_SDK}/sdk/lib/cmake/opencv4)

find_package(OpenCV REQUIRED)

#......
# OpenCV_LIBS 在sdk/native/jni/abi-arm64-v8a/OpenCVConfig.cmake 中有定义
target_link_libraries(myapp
  ${OpenCV_LIBS}
)

OpenCV_DIR若没有赋值,则有可能找不到lib而报错:

   Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
  "OpenCV_DIR" to a directory containing one of the above files.  If "OpenCV"
  provides a separate development package or SDK, be sure it has been
  installed.

参考

Linux上编译OpenCV的Android库
Android OpenCV基础(一、OpenCV入门)
OpenCV的Android使用指南
How to enable logging for OpenCV
我的Opencv4Android添加V4L2支持的移植记录(1)
OpenCV调用V4L相机记录
嵌入式开发板 aarch64 opencv库 交叉编译
Cross compilation for ARM based Linux systems

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

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

相关文章

[2023-07-03]2023博客之星候选--码龄赛道--15年以上

https://bbs.csdn.net/topics/616395535https://bbs.csdn.net/topics/616395535 用户名总原力值当月获得原力值2023年获得原力值2023年高质量博文数75阿酷tony:[博客] [成就]3999345028 博客之星 2023 《码龄赛道 15年以上》第 75 名 啊,75名啊!你叫…

WINDBG 查崩溃

前言:windbg大家都很熟悉,它是做windows系统客户端测试的QA人员很应该掌握的定位程序崩溃原因的工具, 网上也有很多资料,但是真正适合QA阅读和实用的资料不多,我把我认为最重要最应该掌握的结合以前的使用经验分享一下…

SPI机制

SPI机制是Service Provider Interface,是服务提供发现机制,用来启用框架扩展和替换组件。比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的S…

学生台灯护眼好还是防近视好?专家推荐的学生台灯分享

其实学生台灯如果护眼效果好也是能在一定程度上防近视的,这两种是由联系的并不冲突。我们要知道造成近视的主要原因的是什么?是不是每天长时间高强度的学习?是不是长时间玩电子产品没有合理休息?这些都导致一个结果,那…

为什么使用消息队列?消息队列有什么优点和缺点?常用的MQ 都有什么区别,以及适合哪些场景?

问题: 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 为什么使用消息队列? 其实就是问问你消息队列都有哪些使用场景,…

计算机专业大学如何自学?常用网站和工具

耗时5小时,第一个B站视频,满足分享欲 计算机专业现状 or 困境?如何自学?常用网站科普!_哔哩哔哩_bilibili 👆发了个视频,结合文章中的链接,保存到自己浏览器收藏夹里就完了 目录 …

亚马逊买家账号防关联怎么弄?

如果你希望你的亚马逊买家账号不被关联到其他账号,你可以采取以下措施来增强账号的安全性和保护个人信息: 1、强密码:使用强密码来保护你的亚马逊账号。确保密码包含字母、数字和特殊字符,并且长度足够长。避免使用与其他网站或账…

Linux day2

在 Linux 系统中,你看到一个文件的属主和属组都是 root,它的权限是 -rwxrwxr--,那么下面的描述中哪个是不正确的() 官方解析: 文件类型和文件权限由10个字符组成: 第 1 位表示文件的类型&#x…

黄牛泛滥如何影响亚洲的演唱会和现场娱乐行业

随着新冠大流行的结束,中国的各类线下娱乐活动尤其是演唱会等又逐渐红火了起来,但蓬勃发展的现场娱乐活动却饱受日益严重的黄牛问题的困扰。黄牛是指个人通过使用自动化机器人批量购买现场活动门票,然后以高昂的价格转售的行为(黄…

【python】基础应用

python 基础 变量函数函数定义函数参数说明匿名函数 lambda 文件文件编码文件读取文件写入 异常tryExceptionelsefinally异常的传递 模块模块导入自定义python包并导入第三方包的导入 JSON 变量 python 中变量的定义不需要指定变量的类型,直接进行定义,…

五月&六月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 海通证券 通往绝对收益之路(八):“固收”产品股票端的量化解决方案 发布日期:2023-05-05 关键词:固收、股票、量化策略 主要内容:本研报研究了优秀的“固收”产品…

考完PMP就可以做项目经理了?

接触过项目的自然没问题,如果是小白 0经验肯定是不能直接做项目经理的。 首先是要积攒一些经验,如果是纯小白,建议再去考一个P2(prince2)证书,这个证书主要是实操为主,可以带着你手把手去做项目&#xff0…

【C++11】lambda表达式详解

目录 1.lambda引入 2.语法 3.捕捉列表详解 [ ] 不捕获任何外部变量 [] 捕获父作用域的所有变量的值,只读不可以修改 [&]捕获父作用域的所有变量的引用,可修改捕获的变量 [val] 只捕获指定的变量值,不可以修改 [&val] 只捕获外…

【云原生系列】云计算概念与架构设计介绍

1 什么是云计算 云计算是一种基于互联网的计算模式,在这个模式下,各种计算资源(例如计算机、存储设备、网络设备、应用程序等)可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…

读者与写者问题

本篇文章我们使用C探讨一下读者与写者问题. 1. 读者与写者问题引入 读写操作是计算机中对存储区最常见的两种操作. 我们之前探讨了生产者与消费者问题, 知道了如何开启多个线程, 现在就可以直接写出读者与写者问题的最基本的代码了, 仍从最简单的情况开始--两个读者, 代码如下…

React01-React简介及环境搭建

一、SPA 单页面应用 1. 多页面应用(MPA) 一个链接对应一个页面。 优点:便于百度搜索。 缺点:请求量大。 应用:电商网站 2. 单页面应用(SPA) 应用:音乐网站 优点:…

Babylist EDI 需求详解

Babylist 是一个为准父母提供方便和灵活的婴儿注册服务的平台,帮助他们准备迎接新生儿的到来。Babylist 与各种不同的品牌和零售商合作,包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品,并根据自…

9、Redis集群(cluster)

是什么 Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个master 能干嘛 Redis集群支持多个master,每个master又可以挂载多个slave 读写分离 支持数据的高可用 支持海量数据的读写存储操作 由于Cluster自带Sentinel的故障转…

UWB智能定位管理系统源码(Java+ vue+ spring boot)

智能定位管理系统技术架构:Java vue spring boot 一、系统概述 系统聚焦基于UWB(超宽带)技术的底层定位网络和定位算法,通过对定位分站、定位标签、定位引擎的硏发,实现高精度定位网络,获取高精度定位结果,支撑行业大…

爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具

文章目录 前言IP代理与User-Agent伪装IP代理User-Agent伪装 使用Cookie绕过登录验证使用验证码识别工具未完待续... 前言 随着互联网发展,网站数据变得越来越重要。然而,为了保护其数据的安全性和唯一性,网站通常会采取反爬虫措施。本篇博客将…