算能 MilkV Duo开发板实战——opencv-mobile (迷你版opencv库)的移植和应用

前言

OpenCV是一种开源的计算机视觉和机器学习软件库,旨在提供一组通用的计算机视觉工具。它用于图像处理、目标识别、人脸识别、机器学习等领域,广泛应用于计算机视觉任务。

OpenCV-Mobile是OpenCV库的轻量版本,专为移动平台(Android、iOS和ARM Linux)而设计。该项目旨在在移动设备上支持计算机视觉、机器学习和图像处理应用,使开发者能够在移动平台上利用OpenCV的功能。

ChatGPT: 如果OpenCV是一本巨大的百科全书,提供各种计算机视觉工具,那么OpenCV-Mobile就像是一本精简的手册,专注于在移动设备上提供基本的视觉功能。

opencv-mobile 能直接享受上游的 RVV 优化. RISC-V 扩展集,在汇编层面上进行并行运算,加速处理。

我们本次实验期望:在 MilkV 开发板上运行 opencv-mobile,加载图片、缩放、保存图片。

非常感谢opencv-mobile原作者nihui (github.com)!我们本次实验主要是学习nihui老师的实验实现。

原实验地址:opencv-mobile (迷你版opencv库)在 milkv-duo 上的移植和应用 - CV1800B(Duo 中文论坛) - Sophgo,侵删!

实验环境

  • ubuntu 虚拟机或 WSL
  • milkV 开发板
  • 2GB+ SD卡(用于烧录运行 MilkV 系统)
  • USB-TypeC 烧录线

实验步骤

步骤主要如下:

  1. 下载 opencv-mobile 程序包并进行基础配置。
  2. 下载 MilkV 工具链,编译生成 MilkV 平台上的 opencv-mobile 目标文件。
  3. 导入目标文件和待处理图片到开发板上,运行程序进行图片缩放。
  4. 获取并查看最终处理结果。

MilkV 交叉编译工具链烧写

首先,我们在本地 ubuntu 编译 opencv-mobile 程序。程序的目标运行地点在 MilkV 上,在 x86 架构上编译得到的目标文件并不能直接在 RISC-V 架构上运行,因此我们需要 通过MilkV 的专有工具链,在本机上交叉编译。

下载地址:https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz

下载完成后解压到 ubuntu 系统目录中,路径不要包括中文。

解压完成后,我们修改 ~/.bashrc 文件,在结尾添加如下语句,添加环境变量:

$ export RISCV_ROOT_PATH=$HOST_TOOL_PATH/gcc/riscv64-linux-musl-x86_64

$HOST_TOOL_PATH 是你个人解压的 host-tools 路径,比如我的路径是 /home/jingqing3948/tools/host-tools

保存文件后通过 source ~/.bashrc 或重新打开终端使环境变量生效。

下载配置 opencv-mobile

接下来我们下载 opencv-mobile 源码程序,配置编译选项并编译。

$ git clone https://github.com/nihui/opencv-mobile.git
$ cd opencv-mobile

$ wget -q https://github.com/opencv/opencv/archive/4.8.1.zip
$ unzip -q opencv-4.8.1.zip
$ cd opencv-4.8.1

$ truncate -s 0 cmake/OpenCVFindLibsGrfmt.cmake
$ rm -rf modules/gapi
$ patch -p1 -i ../opencv-4.8.1-no-rtti.patch
$ patch -p1 -i ../opencv-4.8.1-no-zlib.patch
$ patch -p1 -i ../opencv-4.8.1-link-openmp.patch
$ rm -rf modules/highgui
$ cp -r ../highgui modules/

$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=../../toolchains/riscv64-unknown-linux-musl.toolchain.cmake -DCMAKE_C_FLAGS="-fno-rtti -fno-exceptions" -DCMAKE_CXX_FLAGS="-fno-rtti -fno-exceptions" -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Release `cat ../../opencv4_cmake_options.txt` -DBUILD_opencv_world=OFF -DOPENCV_DISABLE_FILESYSTEM_SUPPORT=ON ..
$ make -j16
$ make install

nihui 老师:特别提一下,编译过程中会看到 cmake 成功检查并开启了 riscv vector 支持,这对 milkv-duo 芯片是有加速效果的

-- Performing Test HAVE_CPU_RVV_SUPPORT (check file: cmake/checks/cpu_rvv.cpp)
-- Performing Test HAVE_CPU_RVV_SUPPORT - Success

opencv-mobile 附带的 toolchains/riscv64-unknown-linux-musl.toolchain.cmake 全局开启了 c906 内核相关的编译参数,并设置为 c906 优化,这些参数会自动应用在 opencv-mobile 所有模块的编译中,提供最佳性能。

使用 opencv-mobile milkv-duo 优化版实现图片缩放

在克隆的 opencv-mobile/test/ 里有一个示例程序,加载、缩放、保存图片。

jingqing3948@jingqing:~/Develop/opencv-mobile/test$ ls 
build  CMakeLists.txt  main.cpp

image-20231116225842183

程序自动查找当前目录下的 in.jpg,将其大小重置后输出保存文件 out.jpg .

我们在 test 文件夹下新建终端窗口,进行该项目的编译,注意修改 $HOST_TOOL_PATH 为自己的路径。

$ export RISCV_ROOT_PATH=$HOST_TOOL_PATH/gcc/riscv64-linux-musl-x86_64

$ cd opencv-mobile/test

$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=../../toolchains/riscv64-unknown-linux-musl.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DOpenCV_DIR=/home/nihui/dev/opencv-mobile/opencv-4.8.0/build/install/lib/cmake/opencv4 ..
$ make

成功编译后,在 build 文件夹里可以看到可执行程序 opencv-mobile-test

jingqing3948@jingqing:~/Develop/opencv-mobile/test/build$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile  opencv-mobile-test

(可选) 编译出来的二进制可以用交叉编译工具链中的 strip 进一步瘦身.

$ $HOST_TOOL_PATH/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-strip opencv-mobile-test

从工具链里找到 $HOST_TOOL_PATH/gcc/riscv64-linux-musl-x86_64/sysroot/lib64v0p7_xthead/lp64d/libgomp.so.1.0.0 ,复制文件。我们要上传到开发板上的程序文件就是 opencv-mobile-testlibgomp.so.1.0.0 这两个。

以及,准备一张需要缩放的图片。大小尽量不要超过 500KB。重命名为 in.jpg

在 MilkV 上成为点灯大师

首先我们给 sd 卡烧写 MilkV 系统,并将 sd 卡插入 MilkV,通过数据线连接电脑。

系统烧写使用的工具可以从指南中根据指引下载,我们的工具压缩包中也包含了官方镜像和 balenaEtcher_win 安装程序。

烧写系统指南:启动 Duo | Milk-V (milkv.io)

安装 RNDIS 驱动指南:Install RNDIS driver | Milk-V (milkv.io)

打开电脑终端,通过 ssh 方式连接到开发板。opencv-mobile 程序编译部分是在 ubuntu 上跑的,ssh 连接则不局限于什么系统,只要能将文件上传到开发板即可。

> ssh root@192.168.42.1

密码:milkv

成功登录如下图:

1700148302785

可以查看系统信息:

[root@milkv]~# uname -a

[root@milkv]~# df -h

[root@milkv]~# free

1700148587637

当前路径位于 /root/ 文件夹下。我们将输入图片、运行程序均拷贝到此文件夹下运行。首先,我们尝试一个点亮 led 灯的脚本程序。

led.sh 代码如下:

#!/bin/sh

LED_GPIO=/sys/class/gpio/gpio440

if test -d $LED_GPIO; then
    echo "GPIO440 already exported"
else
    echo 440 > /sys/class/gpio/export
fi

echo out > $LED_GPIO/direction

while true; do
    echo 1 > $LED_GPIO/value
done

内容很简单,给 LED GPIO 端口不断赋值为1使得 LED 灯常亮.

在本机重新打开一个终端窗口,通过 scp 命令拷贝文件:

> scp led.sh root@192.168.42.1:/root

1700149061911

在开发板中可以找到并执行该程序:

[root@milkv]~# chmod 777 led.sh

[root@milkv]~# ./led.sh

image-20231116233819427

此时程序循环执行点亮 LED 灯,可以注意到开发板上的蓝灯变成了常亮状态。

image-20231117001939364

在终端窗口中按下 Ctrl+C 强制停止程序执行。

在 MilkV 上运行 opencv-mobile 程序

同样的操作步骤,我们将 in.jpgopencv-mobile-testlibgomp.so.1.0.0 文件上传到开发板。

> scp .\libgomp.so.1.0.0 .\opencv-mobile-test .\in.jpg root@192.168.42.1:/root

1700149458340

[root@milkv]~# chmod 777 -R .

1700149489127

libgomp.so.1.0.0 重命名为 libgomp.so.1

[root@milkv]~# mv libgomp.so.1.0.0 libgomp.so.1

1700149637767

执行如下指令:

[root@milkv]~# LD_LIBRARY_PATH=. ./opencv-mobile-test

可以发现当前目录下新生成了 out.jpg 文件。

1700149900145

在本机通过如下命令将 out.jpg 拷贝到本地,并对比处理前后的图片。

image-20231116235720822

1700150572961

图片压缩成功!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器感染了.DevicData-D-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言: 勒索病毒成为网络安全的严峻挑战,而最新的.DevicData-D-XXXXXXXX勒索病毒更是引起广泛关注。本文将深入介绍.DevicData-D-XXXXXXXX勒索病毒的特征,提供恢复被其加密的数据文件的方法,并分享预防措施,以确保您的数…

单细胞seurat-细胞比例分析-画图详细教程

大家好,今天我们来画单细胞中最简单的细胞比例图~ 1.老规矩,先加载pbmc数据 dir.create("~/gzh/细胞比例") setwd("~/gzh/细胞比例")subset_datareadRDS("~/gzh/pbmc3k_final.rds") table(stringr::str_split(string c…

Bounding boxes augmentation for object detection

Different annotations formats Bounding boxes are rectangles that mark objects on an image. There are multiple formats of bounding boxes annotations. Each format uses its specific representation of bouning boxes coordinates 每种格式都使用其特定的边界框坐标…

TCP聊天

一、项目创建 二、代码 Client类 package tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class Client { public sta…

Elasticsearch- 环境-Windows集群部署和环境-Linux单节点部署和Linux集群部署-03

Elasticsearch环境 环境-简介 单机 & 集群 单台 Elasticsearch 服务器提供服务,往往都有最大的负载能力,超过这个阈值,服务器性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中。除了…

STM32 cubeMX 呼吸灯实验

文章代码使用 HAL 库。 文章目录 一、1.PWM原理二、LED 原理图三、使用cubemx 配置 led四、PWM 相关函数五、PWM占空比占空比计算六、PWM 呼吸灯重要代码总结 呼吸灯 一、1.PWM原理 PWM全称为脉冲宽度调制(Pulse Width Modulation),是一种常…

软著项目推荐 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &#x…

php循环遍历删除文件下文件和目录

前言 今天在写一个demo的时候需要循环删除目录下文件。如下想删temp下文件和目录。 具体实现 private function deleteDir($dirPath){if (is_dir($dirPath)) {$contents scandir($dirPath);// 如果是空目录if (count($contents) 2) {rmdir($dirPath);return;}// 不是空目录f…

windows MYSQL下载和自定路径安装,以及解决中文乱码问题。

文章讲的很详细,请耐心往下看。 一、mysql下载 下载网址:https://www.mysql.com/downloads/ 表示不登录,直接下载。 以上就把安装包下载完了。下载是8.0.35版本。 二、接下来看怎么安装 1.双击安装包,进行安装。 注意&#x…

【论文阅读笔记】M3Care: Learning with Missing Modalities in Multimodal Healthcare Data

本文介绍了一种名为“MCare”的模型,旨在处理多模态医疗保健数据中的缺失模态问题。这个模型是端到端的,能够补偿病人缺失模态的信息,以执行临床分析。MCare不是生成原始缺失数据,而是在潜在空间中估计缺失模态的任务相关信息&…

【web安全】文件包含漏洞详细整理

前言 菜某的笔记总结,如有错误请指正。 本文用的是PHP语言作为案例 文件包含漏洞的概念 开发者使用include()等函数,可以把别的文件中的代码引入当前文件中执行,而又没有对用户输入的内容进行充分的过滤&#xff0…

算法通关村第十八关-青铜挑战回溯是怎么回事

大家好我是苏麟 , 今天聊聊回溯是怎么个事 . 回溯是最重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题,例如组合、分割、子集、排列,棋盘等。从性能角度来看回溯算法的效率并不高,但对于这些暴力都搞不定的算法能出结果就…

区分node,npm,nvm

目录 一,nodejs二,npm三,nvm 区分node,npm,nvm 几年前学习前端的时候学习的就是htmlcssjs 三件套。 现在只学习这些已经不能满足需要了。 一,nodejs nodejs是编程语言javascript运行时环境。(比…

【复杂gRPC之Java调用go】

1 注意点 一般上来说如果java调用java的话,我们可以使用springcloud来做,而面对这种跨语言的情况下,gRPC就展现出了他的优势。 代码放在这了,请结合前面的go服务器端一起使用 https://gitee.com/guo-zonghao/java-client-grpc /…

阿里云实时数据仓库HologresFlink

1. 实时数仓Hologres特点 专注实时场景:数据实时写入、实时更新,写入即可见,与Flink原生集成,支持高吞吐、低延时、有模型的实时数仓开发,满足业务洞察实时性需求。亚秒级交互式分析:支持海量数据亚秒级交…

量子算力引领未来!玻色量子出席第二届CCF量子计算大会

​8月19日至20日,中国计算机学会(CCF)主办的第二届CCF量子计算大会暨中国量子计算峰会(CQCC 2023)在中国合肥成功举办。本届大会以“量超融合,大国算力”为主题,设有量子计算软件、硬件、应用生…

机器学习应用 | 使用 MATLAB 进行异常检测(上)

异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。 在不同行业中,异常检测的典型…

智能优化算法应用:基于材料生成算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于材料生成算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于材料生成算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.材料生成算法4.实验参数设定5.算法结果6.参考…

Tomcat头上有个叉叉

问题原因: 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案: war模式:发布模式,正式发布时用,将WEB工程以war包的形式上传到服务器 war exploded模式:开发时用,将WEB工程的文件夹直接…

Navicat 连接 GaussDB分布式的快速入门

Navicat Premium(16.3.3 Windows版或以上)正式支持 GaussDB 分布式数据库。GaussDB分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构…
最新文章