算能 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/shLED_GPIO=/sys/class/gpio/gpio440if test -d $LED_GPIO; thenecho "GPIO440 already exported"
elseecho 440 > /sys/class/gpio/export
fiecho out > $LED_GPIO/directionwhile true; doecho 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.rhkb.cn/news/214822.html

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

相关文章

[MySQL] SQL优化之性能分析

🌈键盘敲烂,年薪30万🌈 目录 一、索引优化 1、索引是什么: 2、索引的数据结构: 3、索引种类: 4、sql分析(回表查询) 二、定位慢查询语句 1、慢查询日志 2、profile详情 3、…

洛谷P3807 Lucas定理

传送门: P3807 【模板】卢卡斯定理/Lucas 定理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3807题干: 给定整数n,m,p 的值,求出C(nm,n)​mod p 的值。 输入数据保证…

案例027:基于微信小程序的校园二手平台的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…

Pytorch深度强化学习1-6:详解时序差分强化学习(SARSA、Q-Learning算法)

目录 0 专栏介绍1 时序差分强化学习2 策略评估原理3 策略改进原理3.1 SARSA算法3.2 Q-Learning算法 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#…

【论文极速读】LVM,视觉大模型的GPT时刻?

【论文极速读】LVM&#xff0c;视觉大模型的GPT时刻&#xff1f; FesianXu 20231210 at Baidu Search Team 前言 这一周&#xff0c;LVM在arxiv上刚挂出不久&#xff0c;就被众多自媒体宣传为『视觉大模型的GPT时刻』&#xff0c;笔者抱着强烈的好奇心&#xff0c;在繁忙工作之…

class073 背包dp-01背包、有依赖的背包【算法】

class073 背包dp-01背包、有依赖的背包【算法】 算法讲解073【必备】背包dp-01背包、有依赖的背包 code1 P1048 [NOIP2005 普及组] 采药 // 01背包(模版) // 给定一个正数t&#xff0c;表示背包的容量 // 有m个货物&#xff0c;每个货物可以选择一次 // 每个货物有自己的体积…

ChatGPT 应用开发(一)ChatGPT OpenAI API 免代理调用方式(通过 Cloudflare 的 AI Gateway)

前言 开发 ChatGPT 应用&#xff0c;我觉得最前置的点就是能使用 ChatGPT API 接口。首先我自己要能成功访问&#xff0c;这没问题&#xff0c;会魔法就可以本地调用。 那用户如何调用到我的应用 API 呢&#xff0c;我的理解是通过用户能访问到的中转服务器向 OpenAI 发起访问…

带阻滤波器:原理、应用及性能分析?|深圳比创达电子EMC

在现代电子技术和通信领域中&#xff0c;滤波器是一种常见的电路元件&#xff0c;用于处理信号&#xff0c;去除不需要的频率成分或者增强感兴趣的频率成分。本文将重点探讨带阻滤波器&#xff0c;它是一种特殊类型的滤波器&#xff0c;具有在特定频率范围内抑制信号的功能。我…

JVM Optimization Learning(五)

目录 一、JVM Optimization 1、G1 1、G1内存模型 2、基础概念 3、G1特点&#xff1a; 4、CMS日志分析 5、G1日志分析 2、GC参数 2.1、GC常用参数 2.2、Parallel常用参数 2.3、CMS常用参数 2.4、G1常用参数 一、JVM Optimization 1、G1 G1官网说明&#xff1a;Gar…

【微软技术栈】发布自己造的轮子 -- 创建Nuget包(分布操作)

目录 1、您的项目 2、创建 .nuspec 文件 3、一张图片胜过一千个拉取请求 4、包括自述文件 MD 文件 5、构建软件包 6、将包部署到 Nuget.Org 7、手动上传软件包 8、自动化和脚本化部署 9、我们如何构建和部署 ErrLog.IO Nuget 包 10、Nuget统计数据 11、最后的思考 创建 Nuget 包…

生产上线需要注意的安全漏洞

一、关闭swagger 1、关闭swagger v3 # 需同时设置auto-startupfalse&#xff0c;否则/v3/api-docs等接口仍能继续访问 springfox:documentation:enabled: falseauto-startup: falseswagger-ui:enabled: false 2、关闭swagger v2 # 只要不是true就不启用 swagger:enable: fa…

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.83】将主干特征提取网络Backbone改为RevCol

前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目…

Vue3: 给表格多个字段添加排序功能

问题 在Vue3项目中&#xff0c;使用element-plus的表格组件绘制表格后&#xff0c;需要令表格的多个字段可以进行选择排序&#xff08;选择升序或者降序&#xff09;但是排序功能好像有时候会出错&#xff0c;需要排序的字段多了之后&#xff0c;排序功能有时候会不起作用 解…

分子生成领域的stable diffusion - GEOLDM

一、关于stable diffusion 很多人都知道stable diffusion&#xff0c;stable diffusion的出现改变了机器生成领域&#xff0c;让AI技术第一次无比的接近正常人。大语言模型&#xff0c;AIGC概念于是兴起。基于stable diffusion 大家开发了lora&#xff0c; hyperwork等微调技术…

JDK 9 模块化系统 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

博文目录 文章目录 Module System原因JDK 模块化模块描述文件关键字 启用模块化测试结论 Multi-Release jar (MRJAR)原因原理结论用 IDEA 创建多版本兼容 Jar项目结构pom.xml测试 Module System 原因 Java 9引入了模块化系统的主要原因是为了解决Java平台面临的复杂性和可维…

从电商API接口谈电商ERP系统介绍

部分网友反馈小红书APP出现闪退问题。对此&#xff0c;小红书客服微博发文称&#xff0c;如遇到小红书APP无法启动的情况&#xff0c;用户可前往App Store下载最新版本&#xff08;详情可见&#xff1a; &#xff09;小红书闪退崩溃出bug&#xff0c;IT人员要背故障吗&#xff…

【计算机网络实验】实验三 IP网络规划与路由设计(头歌)

目录 一、知识点 二、实验任务 三、头歌测试 一、知识点 IP子网掩码的两种表示方法 32位IP子网掩码&#xff0c;特点是从高位开始连续都是1&#xff0c;后面是连续的0&#xff0c;它有以下两种表示方法&#xff1a; 传统表示法&#xff0c;如&#xff1a;255.255.255.0IP前…

windows下oracle透明网关安装

上一次说了如何在Linux下安装oracle到sqlserver之间的透明网关&#xff0c;现在给大家继续介绍如何在windows下安装。 本文实验环境&#xff1a; 数据库类型 数据库版本 IP oracle 11204 192.168.238.122 MSSQL MSSQL 2008 192.168.239.40 一、oracle服务器配置ODBC源…

linux软件管理

八、软件管理 RPM相关命令 8.1 RPM包管理 8.1.1 RPM概述 RPM Package Manager (原Red Hat Package Manager&#xff0c;现在是一个递归缩写&#xff09; ​ 由Red Hat公司提出&#xff0c;被众多 Linux 发行版所采用也称二进制( binary code) 无需编译,可以直接使用 ​ 无法设…