【鸿睿创智开发板试用】移植OpenCV 4到OpenHarmony 4.1

news2024/12/19 12:26:42

目录

目录

引言

编译系统镜像

(1) 下载代码后解压SDK

(2) 下载docker镜像  

(3) 编译OH

编译OpenCV

下载OpenCV源代码

构建编译配置文件

执行编译命令

安装库和头文件

测试

结语


引言

最近有个需求是在基于RK3568的OpenHarmony 4.1系统中使用OpenCV,于是就尝试了一下OpenCV移植到OpenHarmony的工作。

我使用的开发板是深圳鸿睿创智的H01开发板,它基于RK3568芯片,其他的开发板应该都差不多,可能路径和编译参数会有小的调整。

编译系统镜像

虽然OpenCV是个应用程序库,并不需要添加到系统镜像中,不过为了和开发板镜像采用同样的工具链,最好还是先编译一下系统镜像。

我采用的步骤是厂商建议的方法,也就是利用官方提供的OpenHarmony的Docker。具体方法如下:

(1) 下载代码后解压SDK

  tar -zxvf ohos-H01-sdk.tar.gz
  cd ohos-4.1-Release

(2) 下载docker镜像
  

docker run --name SG368Z-H1 --privileged -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard:3.2


(3) 编译OH

  ./build.sh --product-name rk3568 –ccache --no-prebuilt-sdk   

注意:环境缺少python2会产生报错,需要下载python2再次执行编译命令。(pip install python2)

(4) 镜像生成路径
  out/rk3568/packages/phone/images/

编译OpenCV

移植OpenCV一般有两种方法,一种是将修改OH的gn文件,将OpenCV嵌入到系统文件中一起编译,另一种是用OH的工具链独立编译OpenCV。我采用的是后一种,这种方法和在Linux下惊醒OpenCV的交叉编译是基本相同的,我比较熟悉。但是两种方法是有区别的,前者使用的C++库是libc++_shared.so,而后者是libc++.so。后者的库文件包括在系统的system目录中,所以可执行文件可以直接在系统中运行。而前者的库文件是NDK所要求的,如果OpenCV需要在App中调用,就只能采用第一种方法。如果希望在App中使用OpenCV,可以参考我的另一篇博文:【鸿睿创智开发板试用】在OpenHarmony 4.1环境下移植OpenCV示例-CSDN博客。

代码仓采用的是OpenHarmony社区提供的代码仓:OpenHarmony-SIG/third_party_opencvicon-default.png?t=O83Ahttps://gitee.com/openharmony-sig/third_party_opencv

这个仓库是基于OpenCV官方仓库4.5.5分支进行了OpenHarmony编译适配和拓展,可构建支持在OpenHarmony设备上运行的计算机视觉程序。 

编译之前需要先安装cmake:

apt install cmake

构建步骤如下:

下载OpenCV源代码

执行如下命令下载OpenCV代码到指定目录下。

git clone https://gitee.com/openharmony-sig/third_party_opencv.git

构建编译配置文件

进入到目录"platforms/ohos",修改arm-clang.toolchain.cmake文件如下:

set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_CXX_COMPILER_ID Clang)
SET ( CMAKE_SYSTEM_PROCESSOR arm )

SET ( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
SET ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
SET ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

SET ( CROSS_COMPILATION_ARCHITECTURE armv7-a )

set(CMAKE_TOOLCHAIN_PREFIX llvm-)

#指定c编译工具(确保工具链所在路径已经添加到了PATH环境变量中)和编译标志,使用clang编译时标志中必须指定--target,否则无法交叉编译。
set(CMAKE_C_COMPILER clang)
set(CMAKE_C_FLAGS "--target=aarch64-linux-ohos  -D__clang__  -mfloat-abi=softfp -mfpu=neon-vfpv4 -w")
#指定c++编译工具(确保工具链所在路径已经添加到了PATH环境变量中)和编译标志,必须指定--target,否则无法交叉编译。
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_CXX_FLAGS "--target=aarch64-linux-ohos  -D__clang__  -mfloat-abi=softfp -mfpu=neon-vfpv4 -w")
#指定链接工具和链接标志,必须指定--target和--sysroot。
set(CMAKE_LINKER clang)
set(CMAKE_CXX_LINKER clang++ )
set(CMAKE_C_LINKER clang)

#指定链接库的查找路径。
set(CMAKE_SYSROOT "/home/openharmony/out/rk3568/obj/third_party/musl/")

由于我使用的是官方的Docker环境,clang编译器已经被加入PATH路径,所以这里没有指定编译器的路径。另外,SYSROOT的路径是根据我Docker的设置指定的。如果编译环境和我的配置不同,需要相应修改。

执行编译命令

执行如下命令:

cd third_party_opencv
mkdir build
cd build
cmake -DBUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release -DWITH_CUDA=OFF -DWITH_FFMPEG=ON -DCMAKE_TOOLCHAIN_FILE=../platforms/ohos/arm-clang.toolchain.cmake ..

cmake检查系统环境后,很快会生成makefile,最后看到如下信息表示生成正确。

........

on-sections -fdata-sections  -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed
--     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed
--     ccache:                      YES
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo stitching ts video videoio
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 java python2 python3
--     Applications:                tests perf_tests apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:                           NONE
--     GTK+:                        NO
--
--   Media I/O:
--     ZLib:                        zlib (ver 1.2.11)
--     JPEG:                        libjpeg-turbo (ver 2.1.2-62)
--     WEBP:                        build (ver encoder: 0x020f)
--     PNG:                         build (ver 1.6.37)
--     TIFF:                        build (ver 42 - 4.2.0)
--     JPEG 2000:                   build (ver 2.4.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      NO
--       avcodec:                   NO
--       avformat:                  NO
--       avutil:                    NO
--       swscale:                   NO
--       avresample:                NO
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Lapack:                      NO
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.19.1)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/openharmony/third_party_opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python (for build):            /usr/bin/python2.7
--
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/openharmony/third_party_opencv/build

然后执行如下命令开始编译:

make -j 16

 这个过程可能较长,大概半小时左右,看电脑的配置。

至此,编译成功。 

安装库和头文件

最后,执行安装命令,把需要的头文件和库文件拷贝到一个目录下。

DESTDIR=/home/openharmony/opencv4/ make install

所有需要的文件都可以在"/home/openharmony/opencv4/usr/local/"下找到。

测试

编译后就可以把文件拷贝到设备上进行测试,测试的程序为官方的opencv_version(在opencv4/usr/local/bin目录下),它依赖libopencv_core.so文件在opencv4/usr/local/lib目录下)。

在Windows的控制台使用hdc目录实现文件拷贝。

hdc shell mount -o rw,remount /
hdc file send opencv_version /
hdc file send libopencv_core.so /

其中第一条目录是为了让设备的根目录可以写,否则会出现[Fail]Error opening file:read-only file system,path: xx 报错。

然后使用hdc shell目录登录到设备。

# chmod +x ./opencv_version
# export LD_LIBRARY_PATH=/
# ./opencv_version
4.5.5

移植工作获得了初步成功。 

结语

今天尝试了移植OpenCV 4到OpenHarmony 4.1,和Linux下交叉编译差不多,还比较顺利。后面将继续测试相关的App。

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

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

相关文章

二分查找【Lecode_HOT100】

文章目录 1.搜索插入位置No.352.搜索二维矩阵No.743.在排序数组中查找元素的第一个和最后一个位置No.344.搜索旋转排序数组No.335.寻找旋转排序数组中的最小值No.153 1.搜索插入位置No.35 class Solution {public int searchInsert(int[] nums, int target) {int l 0;int r n…

蜂窝结构机械超材料

本研究设计了两种蜂窝结构机械超材料,具有可变的、依赖于拉伸或压缩的正负泊松比,并通过NOKOV度量动作捕捉验证了超材料的形变特性。 研究人员以《Mechanical Metamaterials with Discontinuous and Tension/Compression-Dependent Positive/Negative Po…

JAVA入门:使用IDE开发

JAVA入门:使用IDE开发 什么是IDE IDE(Integrated Development Environment,集成开发环境)是一种软件应用程序,它为程序开发、软件设计、项目管理等提供全面的设施。 简单来说就是简化开发过程,让编程更加方便。 IDEA 业界公认最好用的JAVA IDE 安装IDEA 打开IDEA官…

opencv # Sobel算子、Laplacian算子、Canny边缘检测、findContours、drawContours绘制轮廓、外接矩形

一、Sobel算子 案例图片 cv2.Sobel(src, ddepth, dx, dy, ksize3, scale1, delta0, borderTypeNone) 功能:用于计算图像梯度(gradient)的函数 参数: src: 输入图像,它应该是灰度图像。 ddepth: 输出图像的所需深度&am…

CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)

1. 引言 在完成了所有必要工具的安装和配置后,我们进入到获取 CEF 源码的阶段。对于 macOS 平台,CEF 的源码获取过程需要特别注意不同芯片架构(Intel 和 Apple Silicon)的区别以及版本管理。本文将详细介绍如何在 macOS 系统上获…

C# OpenCV机器视觉:图像平滑

在一个寒冷的冬日,阿强窝在家里的沙发上,裹着厚厚的毛毯,手里捧着一杯热巧克力。他的朋友们约他一起去滑雪,但阿强却更喜欢待在温暖的家中,享受这份宁静。突然,他的手机响了,是朋友们发来的滑雪…

基于quasar,只选择年度与月份的组件

为什么要做 quasar是个基于vue的强大的UI开发库,它提供了非常多的组件,比如日期选择。但是有些时候只需要选择到月份就可以了,quasar中没有,所以自己动手写了一个。因为对界面编程我不熟悉,所以,如果你有更…

02-3.python入门基础一操作符与表达式

接上章 : 02-2.python入门语法一变量与数据类型2 本文将深入介绍Python中的各种操作符,包括算术操作符、比较操作符、逻辑操作符等,并详细讲解如何使用这些操作符构建表达式。通过丰富的示例与详细的讲解,帮助读者全面掌握这一重要的基础知识…

【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等

【自动化】Python SeleniumUtil 工具 【Python】使用Selenium 操作浏览器 自动化测试 记录-CSDN博客文章浏览阅读58次。文章浏览阅读42次。【附件】Selenium chromedriver 驱动及浏览器下载。【附件】Selenium chromedriver 驱动及浏览器下载-CSDN博客。3.安装Chrome浏览器驱动…

COMSOL快捷键及内置函数

文章目录 COMSOL快捷键使用COMSOL算子求最大值和最小值COMSOL内置函数3.1 解析函数3.2 插值函数3.3 分段函数3.4 高斯脉冲函数3.5 斜坡函数3.6 矩形函数3.7 波形函数3.8 随机函数3.9 Matlab函数3.10 SWITCH函数 COMSOL快捷键 Ctrl+/ 可快速打开预定义的物理量列表。…

QT绘制同心扇形

void ChartForm::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 设置抗锯齿painter.save();// 设置无边框(不需要设置QPen,因为默认是不绘制边框的)QPen pen(Qt::NoPen);// QPen pen…

最大质因子序列

最大质因子序列 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 任意输入两个正整数m, n (1 < m < n < 5000)&#xff0c;依次输出m到n之间每个数的最大质因子&#xff08;包括m和n&#xff1b;…

ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程

本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…

AI芯片常见概念

文章目录 AI芯片常见概念前言常见概念AI芯片分类按照芯片的技术架构分GPU半定制化的 FPGA全定制化 ASIC神经拟态芯片 按应用场景分训练卡推理卡 按部署位置分国产AI卡资料汇总 封装相关Chiplet技术3DIC三星多芯片集成联盟&#xff08;Samsung Multi-Die Integration Alliance&a…

Fiddler(抓包测试工具)下载安装步骤

目录 介绍 主要功能&#xff1a; 使用场景&#xff1a; 一、下载 二、安装 ​编辑三、测试 介绍 Fiddler 是一个强大的网络调试工具&#xff0c;用于捕获和分析 HTTP/HTTPS 请求与响应。它通过代理服务器捕获流量&#xff0c;帮助开发者调试 Web 应用、API&#xff0c;进…

Elasticsearch-DSL高级查询操作

一、禁用元数据和过滤数据 1、禁用元数据_source GET product/_search {"_source": false, "query": {"match_all": {}} }查询结果不显示元数据 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…

gorm源码解析(四):事务,预编译

文章目录 前言事务自己控制事务用 Transaction方法包装事务 预编译事务结合预编译总结 前言 前几篇文章介绍gorm的整体设计&#xff0c;增删改查的具体实现流程。本文将聚焦与事务和预编译部分 事务 自己控制事务 用gorm框架&#xff0c;可以自己控制事务的Begin&#xff0…

什么是双声道立体声环绕声全景声 | 一文讲清楚沉浸式声音基本设定

目录 一、 沉浸式声音基本概念1. 声学上的沉浸式2. 空间音频技术3. 声源位置4. 人耳声音定位&#xff08;水平&垂直方向&#xff09;5. 人耳对声源距离定位的影响因素6. 头部相关传递函数7. 三维声技术8. “双耳”与“立体声”9. 耳机重放与扬声器重放10. 环绕声11. 高度声…

使用C语言库函数格式化输入时格式类型与数据类型不匹配导致程序异常

问题 使用两次sscanf()库函数从两个字符串中按照指定的格式读取数据&#xff0c;执行完毕后发现第一个正常读取的数据被篡改。项目在Ubuntu上使用CMake和Ninja构建项目&#xff0c;编译时没有错误和警告。 复现 为方便调试&#xff0c;在keil中编译stm32工程代替&#xff0c…

车牌识别之三:检测+识别的onnx部署(免费下载高精度onnx模型)

依赖 paddle2onnx1.3.1 onnxruntime-gpu1.14.0 ultralytics8.3.38背景 在车牌识别之一&#xff1a;车牌检测(包含全部免费的数据集、源码和模型下载&#xff09;我们得到了车牌检测模型&#xff1b; 在车牌识别之二&#xff1a;车牌OCR识别(包含全部免费的数据集、源码和模型…