算能 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.mzph.cn/news/213286.shtml

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

相关文章

学习 NVIDIA Omniverse 的最基础概念

无用的前言 近两年关于 Omniverse 的宣传一直很多,可我一直没去了解,连它是个啥都不知道。最近正好有契机需要了解它,于是我今天抽时间看了些它的官方介绍,并按照自己的理解梳理在这里。 官方资料索引 Omniverse 官网主页&…

Nacos配置管理-微服务配置拉取

yaml已配置内容 目录 一、配置获取步骤 二、统一配置管理步骤 三、Nacos管理配置的步骤总结 一、配置获取步骤 二、统一配置管理步骤 1、引入Nacos的配置管理客户端依赖: <!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud&l…

CRM是什么?企业为什么需要CRM?

CRM是什么 CRM的全称是Customer Relationship Management&#xff0c;即客户关系管理&#xff0c;是一种企业与现有客户及潜在客户之间关系互动的管理系统&#xff0c;是企业“以客户为中心”价值观的核心体现之一。 客户是一家企业最宝贵的资源。CRM系统最关键的就是能够帮助…

复亚智能无人机机场适配最新大疆无人机

无人机已经在各个领域得到广泛应用&#xff0c;但由于操作难度、起降场地等问题&#xff0c;其应用范围和效率受到了一定限制。随着无人机机场研发技术的成熟&#xff0c;许多实际操作中的难题得以解决&#xff0c;使得无人机应用变得更加高效。接下来&#xff0c;我们将深入了…

修改代码后idea如何将代码提交到公司git上

1、需要先更新最新的代码到本地&#xff1b;&#xff08;此步骤防止&#xff0c;公司其他人在此期间已经提交了最新代码&#xff0c;但是自己本地项目没有拉取最新代码&#xff0c;导致最后版本冲突&#xff09; 打开idea---》鼠标项目项目名上右击---》选择Git---》选择pull-…

MySQL数据库,创建和管理表

创建数据库&#xff1a; 方式一&#xff1a;创建数据库 CREATE DATABASE 数据库名&#xff1b;&#xff08;使用的是默认的字符集&#xff09; 方式二&#xff1a;创建数据库并指定字符集 CREATE DATABASE 数据库名 CHARACTER SET 字符集&#xff1b; 方式三&#xff1a;判断数…

每天五分钟计算机视觉:使用1*1卷积层来改变输入层的通道数量

本文重点 在卷积神经网络中有很多重要的卷积核&#xff0c;比如1*1的卷积核&#xff0c;3*3的卷积核&#xff0c;本文将讲解1*1的卷积核的使用&#xff0c;它在卷积神经网络中具有重要的地位。由于1*1的卷积核使用了最小的窗口&#xff0c;那么1*1的卷积核就失去了卷积层可以识…

调试备忘录-NTC电阻的使用(教程 + 代码)

软件环境&#xff1a;CodeWarrior 11.1 硬件环境&#xff1a;NXP S9KEAZ64A 传感器参数&#xff1a;NTC热敏电阻(R25 50k,B25-50 3950) 写在前面 最近做小项目需要用到NTC电阻&#xff0c;因此写一个调试备忘录记录下。 什么是NTC电阻&#xff1f; NTC热敏电阻就是负温度…

【flink番外篇】2、flink的23种算子window join 和interval join 数据倾斜、分区介绍及详细示例-完整版

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

行人重识别paper汇总

文章目录 2021Learning Generalisable Omni-Scale Representations for Person Re-Identification 参考 2021 Learning Generalisable Omni-Scale Representations for Person Re-Identification code: https://github.com/KaiyangZhou/deep-person-reid 摘要&#xff1a;一…

GLAB | CCNA+HCIA=融合课-最新开课通知

敲重点! 12月17日 CCNAHCIA 周日开课啦&#xff01; CCNA&#xff08;Cisco Certified Network Associate&#xff09;认证是Cisco售后工程师认证体系的入门认证&#xff0c;也是Cisco各项认证中级别最低的技术认证通过CCNA认证可证明你已掌握网络的基本知识&#xff0c;并能…

TypeScript入门实战笔记 -- 01 如何快速搭建 TypeScript 学习开发环境?

&#x1f34d;IDE for TypeScript 在搭建 TypeScript 环境之前&#xff0c;我们需要先认识几款适合 TypeScript 的 IDE。只有这样&#xff0c;在开发时我们才能根据实际情况选择合适的 IDE 进行安装&#xff0c;从而提升工作效率。 VS Code Visual Studio Code&#xff08;VS C…

public static final

常量对象中声明并赋值的正确写法一&#xff1a; public class RoleConstant {public static final List<String> PROBLEM_VIEW_ALL_DATA new ArrayList<String>() {{add("角色1");add("角色2");add("角色3");}};}常量对象中声明并…

设计模式篇---代理模式

文章目录 概念结构实例静态代理动态代理 总结 概念 代理模式&#xff1a;给某一个对象提供一个代理或占位符&#xff0c;并由代理对象来控制对原对象的访问。 比如我们想从其他国家买东西&#xff0c;但我们无法直接联系外国的商家&#xff0c;可以找代理商&#xff0c;让他们…

dell r720远程网络安装ubuntu20.04(无U盘)

登陆后界面&#xff0c;在主界面上&#xff0c;我们就可以看到各个硬件组件的状态。在快速启动任务栏中&#xff0c;可以对系统电源进行操作&#xff0c;如开机、关机等。安装操作系统&#xff0c;在虚拟控制台预览处点击>启动 按照浏览器出现的提示确定安装控件等&#x…

NSSCTF web刷题记录7

文章目录 [SDCTF 2022]CURL Up and Read [SDCTF 2022]CURL Up and Read 考点&#xff1a;SSRF 打开题目发现是curl命令&#xff0c;提示填入url 尝试http://www.baidu.com&#xff0c;成功跳转 将url的字符串拿去解码&#xff0c;得到json格式数据 读取下环境变量&#xff0c…

基础宠物商店管理系统(Java)大一程序设计

一.开发环境 Windows 11 -- JDK 21 -- IDEA 2021.3.3 二.需求 三.代码部分 //创建一个宠物类&#xff0c;被另外两类继承public class Pet {private String name;private int age;private String gender;private double cost0;//买进价格private double sellprice0;//卖出价…

【Spring】Spring统一功能处理

Spring统一功能处理 拦截器拦截器什么是拦截器拦截器的基本使用定义拦截器注册配置拦截器 拦截器详解拦截器的拦截路径配置拦截器实现原理初始化处理请求 适配器模式 统一数据返回格式统一数据返回格式快速入门 统一异常处理 拦截器 场景: 我们要对一个网站实现强制登陆的功能…

ChibiOS简介2/5

ChibiOS简介2/5 1. 源由2. ChibiOS基础知识2/52.4 Chapter 4 - ChibiOS General Architecture2.4.1 The Big Picture&#xff08;总体框图&#xff09;2.4.2 Embedded Components&#xff08;嵌入式组件&#xff09;2.4.3 Application Model&#xff08;应用模型&#xff09;2.…

爬虫解析——Xpath的安装及使用(五)

目录 一、Xpath插件的安装 二、安装 lxml 三、Xpath解析文件 1.解析本地文件 &#xff08;1&#xff09;导入本地文件 &#xff08;2&#xff09;解析本地文件 2.服务器文件解析 &#xff08;1&#xff09;获取网页源码 &#xff08;2&#xff09;解析服务器响应文件 …