福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换
一、实验目的
在深度学习中,往往需要从一张大图中裁剪出一张张小图,以便适应网络输入图像的尺寸,这可以通过bmcv_image_crop函数实现。 实践中,经常需要对输入图像的尺寸进行调整,以适用于网络输入图片尺寸,这可以通过bmcv提供的resize函数实现。目标检测时需要将检测到的目标位置用矩形框出来,这可以通过bmcv_image_draw_rectangle函数实现。本实验的目的是掌握算能的BMCV函数bmcv_image_crop, bmcv_image_resize,bmcv_image_draw_rectangle的使用方法。
二、实验内容
编写bmcv代码,调用bmcv_image_crop, bmcv_image_resize函数实现图片裁剪及尺寸的变换,调用bmcv_image_draw_rectangle函数来在指定的位置上画矩形框。
三、开发环境
开发主机:Ubuntu 22.04 LTS
硬件:算能SE5
本地如果有SE5硬件,则可以PC机作为客户端,SE5作为服务器端。本地如果没有SE5硬件,只有云空间,则可以直接将客户端和服务器端都通过云空间实现,机在云空间的SE5模拟环境中实现。
四、实验器材
开发主机 + 云平台
五、实验过程与结论
本实验涉及的程序框架与实验4的图4-1一致,仅需根据具体调用的API函数配置相关参数即可,因此接下来重点介绍API函数的参数及其调用方法。
BMCV关键函数介绍-bmcv_image_crop
算能BMCV提供了bmcv_image_crop,方便根据需要裁剪所需数量、大小的图,具体函数形式如下:
bm_status_t bmcv_image_crop(bm_handle_t handle, //句柄int crop_num,bmcv_rect_t* rects,bm_image input,bm_image* output)
函数的接口中,crop_num为需要裁剪出的小图数量,input 指针指向输入图像,即 bm_image 对象;output指向输出图像,rects指针指向bmcv_rect_t的结构体,表示裁剪相关的信息,包括起始坐标、crop 宽高。该指针指向了若干个crop 框的信息,框的个数由crop_num 决定。
返回值bm_status_t为BM_SUCCESS则表示裁剪成功,否则为失败。
bmcv_rect_t结构体的格式如下所示:
Typedef struct bmcv_rect{int start_x; // 起始横坐标int start_y; // 起始纵坐标int crop_x; // 输出图像宽度int crop_y; // 输出图像高度
} bmcv_rect_t;
代码调用方式如下:
//配置crop矩形的相关信息
bmcv_rect_t crop_attr;
crop_attr.start_x = 0;
crop_attr.start_y = 0;
crop_attr.crop_w = 600;
crop_attr.crop_h = 600;
bm_image input, output;
//input, output的创建代码省略
//代码主要框架参考实验4
bmcv_image_crop(handle,1,&crop_attr,input,&output)
算能BMCV提供了bmcv_image_resize,方便对输入的若干张图片进行尺寸调整,或者在一张大图上进行抠图并进行尺寸调整,具体函数形式如下:
bm_status_t bmcv_image_resize(bm_handle_t handle, // bm_handle句柄int input_num,bmcv_resize_image resize_attr[4],bm_image* input,bm_image* output)
函数参数中,返回值为BM_SUCCESS表明尺寸调整成功,否则为失败;
在调用bmcv_image_resize() 之前必须确保输入的image 内存已经申请。支持最大尺寸为2048*2048,最小尺寸为16*16,最大缩放比为32。
input 和output参数为指向输入/输出 bm_image 对象的指针。每个bm_image 需要外部调用bmcv_image_create 创建。image内存可以使用bm_image_alloc_dev_ mem 或者bm_image_copy_host_to_device 来开辟新的内存,或者使用bmcv_ image_attach 来attach 已有的内存,在输出时如无分配将在api 内部自行分配。
image_num 表示输入待调整尺寸的图片数,最多支持4张,如果input_num > 1, 那么多个输入图像必须是连续存储的(可以使用bm_image_alloc_contiguous_mem 给多张图申请连续空间);resize_attr[4]为每张图片对应的 resize 参数, 最多支持 4 张图片,其类型为bmcv_resize_image结构体。
bmcv_resize_image描述了一张图中resize 配置信息,其具体格式如下:
typedef struct bmcv_resize_image_s{bmcv_resize_t *resize_img_attr;int roi_num;unsigned char stretch_fit;unsigned char padding_b;unsigned char padding_g;unsigned char padding_r;unsigned int interpolation;
}bmcv_resize_image;
其中,roi_num 描述了一副图中需要进行resize 的子图总个数;stretch_fit 表示是否按照原图比例对图片进行缩放,1 表示无需按照原图比例进行缩放,0表示按照原图比例进行缩放,当采用这种方式的时候,结果图片中未进行缩放的地方将会被填充成特定值;padding_r,padding_g, padding_b 表示当stretch_fit 设成0的情况下,rgb通道上被填充的值; interpolation 表示缩图所使用的算法, 设为BMCV_INTER_NEAREST 表示最近邻算法,设为BMCV_INTER_LINEAR 表示线性插值算法。
resize_img_attr为bmcv_resize_t结构体类型的指针,其具体内容如下所示:
typedef struct bmcv_resize_s{int start_x;int start_y;int in_width;int in_height;int out_width;int out_height;
}bmcv_resize_t;
其中,start_x 描述了resize 起始横坐标(相对于原图),常用于抠图功能, start_y 描述了resize 起始纵坐标(相对于原图),常用于抠图功能;in_width, in_height描述了crop 图像的宽和高。out_width 和out_height描述了输出图像的宽和高。
函数调用方式如下:
int image_num = 1;
int crop_w = 400, crop_h = 400;
int resize_w = 400, resize_h = 400;
int image_w = 1000, image_h = 1000;
int img_size_i = image_w * image_h * 3;
int img_size_o = resize_w * resize_h * 3;bmcv_resize_image resize_attr[image_num];
bmcv_resize_t resize_img_attr[image_num];for (int img_idx = 0; img_idx < image_num; img_idx++) {resize_img_attr[img_idx].start_x = 0; //抠图的起始横坐标resize_img_attr[img_idx].start_y = 0; //抠图的起始纵坐标resize_img_attr[img_idx].in_width = crop_w; //抠图的宽resize_img_attr[img_idx].in_height = crop_h; //抠图的高resize_img_attr[img_idx].out_width = resize_w; //输出的宽resize_img_attr[img_idx].out_height = resize_h; //输出的高
}for (int img_idx = 0; img_idx < image_num; img_idx++) {resize_attr[img_idx].resize_img_attr = &resize_img_attr[img_idx];resize_attr[img_idx].roi_num = 1;resize_attr[img_idx].stretch_fit = 1;resize_attr[img_idx].interpolation = BMCV_INTER_NEAREST;
}bm_image input[image_num];
bm_image output[image_num];cv::Mat Input,Out;
Input = cv::imread(argv[1], 0);for (int img_idx = 0; img_idx < image_num; img_idx++) {//创建输入输出图像对象,并分配空间,转化为BMI格式bmcv_image_resize(handle, image_num, resize_attr, input, output);
}
BMCV关键函数介绍-bmcv_image_draw_rectangle
算能BMCV提供了bmcv_image_draw_rectangle,以便用矩形框出感兴趣区域。具体函数形式如下:
bm_status_t bmcv_image_draw_rectangle(bm_handle_t handle,bm_image image,int rect_num,* rects,int line_width,unsigned char r,unsigned char g,unsigned char b)
其中,handle为bm_handle 句柄;image是需要在其上画矩形框的bm_image 对象;rect_num为绘制矩形数量,指rects 指针中所包含的bmcv_rect_t 对象个数;rects为指向bmcv_rect_t对象(参考bm_image_resize函数参数说明)的指针,用以表示各个框所绘制的矩形数据(宽高等);line_width表示线宽;r,g,b为所绘制线条三原色的值。
在代码中调用方式如下:
bm_image src;
//创建图像
bmcv_rect_t rect;
rect.start_x = 100;
rect.start_y = 100;
rect.crop_w = 200;
rect.crop_h = 300;//在src对应的图像对象上,画1个框,框的信息在rect对象里描述。矩形线宽为3,颜色为红色。
bmcv_image_draw_rectangle(handle,src,1,&rect,3,255,0,0);
OpenCV函数介绍
在OpenCV中,可以直接通过对图像长、宽维度进行操作,以实现图像剪裁的效果,如下所示
dst=src[200:2560,300:2062]
OpenCV提供resize函数,可以用于图像尺寸缩放,其函数接口如下所示
void resize (InputArray src,OutputArray dst,Size dsize,double fx=0, double fy=0,int interpolation=INTER_LINEAR)
其中,src是原图,dst是输出结果图,fx表达横向的放缩倍数,fy表达纵向的放缩倍数,dsize表达放缩后的图像的横和纵向长度;interpolation为插值方式。
其调用方式如下图所示。
resize(src, dst, Size(), 0.5, 0.5, interpolation);
OpenCV提供rectangle函数,以实现在输入图像img上画出一个矩形,此时矩形通过左上角的点和右下角的点坐标pt1,pt2 表示。 函数参数含义与
void cv::rectangle(InputOutputArray img,Point pt1, // 矩形框左上角点的坐标Point pt2, // 矩形框右下角点的坐标const Scalar & color, // 线的颜色int thickness = 1, // 线的宽度int lineType = LINE_8, // 线的类型int shift = 0 // 点坐标中小数位数。
)
执行结果
bmcv_crop:
执行make后上传到云平台或者SOC盒子中,即可实现对图片的裁剪。
root@06416e512cb7:/tmp/crop# chmod 777 bmcv_crop
root@06416e512cb7:/tmp/crop# ./bmcv_crop cutecat.jpeg
open /dev/jpu successfully,device index = 0, jpu fd = 8,vpp fd = 9
效果如下:

root@b3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_resize# ls
Makefile Readme.md bmcv_resize2 bmcv_resize2.cpp bmcv_resize2.o common.h cutecat.jpeg out.jpe
bmcv_resize:
按照实验1、实验2步骤,生成可执行文件并上传到算能盒子,执行:
bmcv_resize文件夹内的文件如图所示
root@b3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_resize# ls
Makefile Readme.md bmcv_resize2 bmcv_resize2.cpp bmcv_resize2.o common.h cutecat.jpeg out.jpeg

Greycat.jpeg如图所示
给可执行文件赋权限并执行
root@06416e512cb7:/tmp/crop# chmod 777 bmcv_resize
root@06416e512cb7:/tmp/crop# ./bmcv_resize greycat.jpeg bmcv
Open /dev/jpu successfully,device index = 0,jpu fd = 8,vpp fd = 9root@06416e512cb7:/tmp/crop# ./bmcv_resize greycat.jpeg opencv
Open /dev/jpu successfully,device index = 0,jpu fd = 4,vpp fd = 5
执行结果如下所示(生成out.jpg)
root@b3e319d8aoc8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_resize# ls
Makefile Readme.md bmcv_resize2 bmcv_resize2.cpp bmcv_resize2.o common.h cutecat.jpeg out.jpg

bmcv_drawrect:
类似地,执行画矩形框的代码,可画出矩形框,具体如下:
root@06416e512cb7 : /tmp/crop# chmod 777 bmcv_ drawrect
root@06416e512cb7:/tmp/crop# ./bmcv_drawrect greycat.jpeg bmcv
Open /dev/jpu successfully,device index = 0, jpu fd = 4,vpp fd = 5
执行结果如下所示(生成out.jpg)
root@b3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_drawrect# ls
Makefile Readme.md bmcv_drawrect bmcv_drawrect.cpp bmcv_drawrect.o common.h cutecat.jpeg greycat.jpeg out.jpgroot@b3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_drawrect#

生成的结果out.jpg如上图所示。
相关文章:
福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换
一、实验目的 在深度学习中,往往需要从一张大图中裁剪出一张张小图,以便适应网络输入图像的尺寸,这可以通过bmcv_image_crop函数实现。 实践中,经常需要对输入图像的尺寸进行调整,以适用于网络输入图片尺寸࿰…...
LLM之Prompt(二):清华提出Prompt 对齐优化技术BPO
论文题目:《Black-Box Prompt Optimization: Aligning Large Language Models without Model Training》 论文链接:https://arxiv.org/abs/2311.04155 github地址:https://github.com/thu-coai/BPO BPO背景介绍 最近,大型语言模…...
chatglm3部署使用
chatglm3部署使用 1.部署2.使用3.接入微信4.vue前端 1.部署 1.首先去github下载chatglm3代码。Huggingface下载模型一直失败,所以用阿里的魔塔社区下载。 git clone https://github.com/THUDM/ChatGLM3.git git clone https://www.modelscope.cn/ZhipuAI/chatglm3…...
Android扫码ZXing
1. 获取权限 请注意动态申请及重写申请结果返回方法。 <uses-permission android:name"android.permission.CAMERA"/> 2. 添加依赖 //Gradle Scripts -> build.gradle(Module:app) implementation com.google.zxing:core:3.4.1 implementation com.jour…...
求解Beamforming-SOCP(CVX求解)
时间:2023年11月23日14:00:16: 直接上代码(辛苦两天才改出来的) clear all; K 4; %user number N4; %base station number var1e-9; H []; %initialize H matrix for i1:Kh 1/sqrt(2*K)*mvnrnd(zeros(N,1),eye(N),1)1i/sqrt(2*…...
解决Vue项目的runtime-only转为runtime-compiler
我们在vue.config.js中添加上 runtimeCompiler: true,然后再将main.js入口文件中的Vue实例改为以下即可 //修改前 new Vue({router,store,render: (h) > h(App) }).$mount(#app) //修改后 new Vue({el:#app,router,store, components:{App}, template:<App/>})...
hash模式和history模式
在Vue Router中,有两种路由模式可供选择:hash模式和history模式。它们各自有一些优点和缺点,下面是它们的简要介绍: hash模式的原理是通过hashchange事件,通过监听hash变化来驱动界面变化。它的url中有 # 号 1、监听…...
聊聊logback的LevelFilter
序 本文主要研究一下logback的LevelFilter AbstractMatcherFilter ch/qos/logback/core/filter/AbstractMatcherFilter.java public abstract class AbstractMatcherFilter<E> extends Filter<E> {protected FilterReply onMatch FilterReply.NEUTRAL;protect…...
mysql 行转列 GROUP_CONCAT 试验
1.概要 很多时候需要用到行专列的方式做数据分析。比如对通讯数据的采集 数据采集结果如下: 变量值采集周期131251132272 我想要看的结果 变量1变量2采集周期351372 就是我想看到相关数据的周期变化情况。 2.试验 2.1创建数据如下(表名 tb5&…...
HarmonyOS元服务开发实战—端云一体化开发
还记得我第一次接触arkui还是在22年的9月份,当时arkui还在一个比较初试的阶段。时隔一年再见方舟框架,它已经发生了令人瞩目的变化,不得不说华为方舟框架在更新迭代的速度已经遥遥领先。新的功能和性能优化让这个框架更加强大和灵活ÿ…...
【搭环境】装Python3.8 open3d
先装Python3.8 方法一试了找不到Python3.8的库,所以用方法二装上了。 Python3加入环境变量 更改Python默认指向 open3d需要Python3.6以上,最好用Ubuntu18版本,我用的16版本。。...
【C语言】深入解开指针(四)
🌈write in front :🔍个人主页 : 啊森要自信的主页 ✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&am…...
AMEYA360:瑞萨面向高端工业传感器系统推出高精度模拟前端的32位RX MCU
全球半导体解决方案供应商瑞萨电子(TSE:6723)宣布面向高端工业传感器系统推出一款全新RX产品——RX23E-B,扩展32位微控制器(MCU)产品线。新产品作为广受欢迎的RX产品家族的一员,具有高精度模拟前…...
切面Aspect + 策略模式实现待办提醒功能
1.背景 产品需要实现一个待办提醒功能,就是核心业务发生变更即提醒业务员去处理相关业务。譬如:订单上传了支付凭证,那么就会提醒相关业务员去待办列表操办。 2.表设计 其实表设计主要是两张表sys_todo、sys_todo_detail 一张是待办核心表…...
SAP 调取http的x-www-form-urlencoded形式的接口
一、了解下x-www-form-urlencoded形式对于SAP来说有啥区别 简单来说, 1.raw格式就是标准的json格式:{“Name”:“John Smith”,“Age”: 23} 2.x-www格式是要转化一下的:NameJohnSmith&Age23 字段与字段相互连接要用 & 符…...
thingsboard3.6的mailConfigTemplateController错误
1、bug内容 使用3.6版本的tb代码进行打包生成boot的jar包,在启动的时候会报错mailConfigTemplateController bean初始化找不到文件路径。 Error creating bean with name mailConfigTemplateController defined in URL [jar:file:/D:/yuxinwei/AE/thingsboard/thingsboard-3…...
Go语言中获取IP
简介 在net包中提供了获取所有网卡的ip,一般不会用127.0.0.1,::1这样的本地回环地址,可以过滤掉,如果想要获取当前真正在使用的地址,得通过net.Dail去连一下才知道 获取ip地址 func main() {fmt.Println(getIpv4())fmt.Println…...
【Computer Vision Foundation】全球计算机视觉基金会论文网
计算机视觉基金会(Computer Vision Foundation,简称CVF)是一个致力于推动计算机视觉领域研究和发展的组织。以下是关于计算机视觉基金会的一些基本信息: 成立目的: CVF成立的目的是促进计算机视觉领域的学术研究、技术…...
计网(复习自用)
计算机网络 1.概述 1.1概念 含义 计算机网络:是一个将分散的。具有独立功能的计算机系统,通过通信设备和线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 简单点说,计算机网络是互联的,自治的计算机集…...
安徽省广德市选择云轴科技ZStack Cloud云平台建设县级智慧城市
信创是数字中国建设的重要组成部分,也是数字经济发展的关键推动力量。作为云基础软件企业,云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施,ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级,是其中唯一兼容四种…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
