福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换

一、实验目的

在深度学习中,往往需要从一张大图中裁剪出一张张小图,以便适应网络输入图像的尺寸,这可以通过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

算能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 = 9

root@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.jpg

root@b3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_drawrect# 

生成的结果out.jpg如上图所示。

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

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

相关文章

计网(复习自用)

计算机网络 1.概述 1.1概念 含义 计算机网络&#xff1a;是一个将分散的。具有独立功能的计算机系统&#xff0c;通过通信设备和线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 简单点说&#xff0c;计算机网络是互联的&#xff0c;自治的计算机集…

低成本打造便携式无线网络攻防学习环境

1.摘要 一直以来, 无线网络安全问题与大众的个人隐私息息相关, 例如: 为了节省流量, 连接到一个看似安全的免费WiFi, 在使用过程中泄露自己的各类密码信息甚至银行卡账号密码信息。随着家用智能电器的普及, 家中的各类智能设备连入家里的无线网络, 却突然失灵, 甚至无法正常连…

碳化硅MOS/超结MOS在直流充电桩上的应用-REASUNOS瑞森半导体

一、前言 直流充电桩是新能源汽车直流充电桩的简称&#xff0c;一般也被叫做“快充”。直流充电桩一般与交流电网连接&#xff0c;可作为非车载电动汽车的动力补充&#xff0c;是一种直流工作电源的电源控制装置&#xff0c;可以提供充足的电量&#xff0c;输出电压和电流可以…

Windows日常故障自我排查:用工具eventvwr.msc(事件查看器)分析问题故障

windows故障排查方法一&#xff1a; 工具用法 系统故障问题时&#xff0c;找不到解决方法 首先&#xff0c; 在搜索栏输入&#xff1a; 事件查看器(eventvwr.msc) 打开程序 根据程序找到程序运行的LOG 根据程序Operational筛选出错误日志&#xff1a; 日志中找错误原因&…

itext - PDF模板套打

项目需求&#xff1a;获取列表数据之后直接将数据生成一个pdf。因此需要使用到 itext 对pdf进行直接操作。 环境配置 需要为pdf添加文字域&#xff0c;因此需要安装Adobe Acrobat 准备一个空的PDF文件&#xff0c;如果有现成的模板更好 依赖配置&#xff0c;我们使用itext的7版…

揭示卡尔曼滤波器的威力

一、说明 作为一名数据科学家&#xff0c;我们偶尔会遇到需要对趋势进行建模以预测未来值的情况。虽然人们倾向于关注基于统计或机器学习的算法&#xff0c;但我在这里提出一个不同的选择&#xff1a;卡尔曼滤波器&#xff08;KF&#xff09;。 1960 年代初期&#xff0c;Rudol…

基于H1ve一分钟搭好CTF靶场

写在前面 ◉ ‿ ◉ 上一篇文章给大家详细介绍了基于H1ve搭建CTF靶场&#xff0c;以及过程中可能遇到的报错及解决方法&#xff0c;那么这篇文章&#xff0c;我总结了一下&#xff0c;将不会遇到报错的方法给到大家&#xff0c;但是前提是你的服务器最好是一个全新的哦~~~ 我…

小程序订阅消息

wx.requestSubscribeMessage({tmplIds: [2IdqlWrqSbjAurzIuW8imeK-ftS8gbhYdZ0icdE],success(res) {console.log(res);// 处理用户授权结果},fail(err) {console.error(err);// 处理授权请求失败}});

淡入淡出transition: right 1s

transition: right 1s; //重点直接改变right值 操作过快 这里用该方法实现1s内淡入淡出 达到效果目标

20230511 Windows Ubuntu vscode remote-ssh 连接配置

参考 &#xff1a; VSCode SSH 连接远程ubuntu Linux 主机 VSCode通过Remote SSH扩展连接到内网Ubuntu主机 Ubuntu 安装 sudo apt-get install openssh-server vscode: 安装remote-ssh 插件 连接到服务器IP 免密登录的公钥密钥传递用filezillaUbuntu 和 Windows 文件互传 …

ios(swiftui) 画中画

一、环境 要实现画中画 ios系统必须是 iOS14 本文开发环境 xcode14.2 二、权限配置 在项目导航器中单击项目&#xff0c;然后单击Signing & Capabilities。单击 Capabilit搜索Background Modes&#xff0c;然后双击将其添加为功能。在新添加的Background Modes部分&a…

chatglm3部署使用

chatglm3部署使用 1.部署2.使用3.接入微信4.vue前端 1.部署 1.首先去github下载chatglm3代码。Huggingface下载模型一直失败&#xff0c;所以用阿里的魔塔社区下载。 git clone https://github.com/THUDM/ChatGLM3.git git clone https://www.modelscope.cn/ZhipuAI/chatglm3…

SpringMVC 基础知识

学习目标 掌握基于 SpringMVC 获取请求参数与响应 json 数据操作熟练应用基于 REST 风格的请求路径设置与参数传递能够根据实际业务建立前后端开发通信协议并进行实现基于 SSM 整合技术开发任意业务模块功能 1 SpringMVC 简介 1.1 概述 1.1.1 web程序开发流程 【执行过程】…

Hook+jsdom 解决cookie逆向

前言 记录下如何破cookie逆向 目标 目标网址:https://q.10jqka.com.cn/ 目标接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 对抗:cookie反爬虫处理,关键字v,如图 解决步骤 1、JS中关键字查找 如上,我们找到了关键字 v,…

etoken是什么意思,有什么作用?

EToken是一种数字货币&#xff0c;它是由以太坊区块链平台发行的智能合约&#xff0c;旨在为以太坊生态系统提供一种安全、可靠、去中心化的交易媒介。EToken具有多种作用&#xff0c;下面将详细介绍。 一、EToken的定义和发行 EToken是由以太坊智能合约创建的数字货币&#xf…

交易宝订单系统使用心得

简介 交易宝是管理订单支付的软件系统&#xff0c;可对多个应用的支付业务进行统一管理和运营&#xff0c;为你节省时间和精力&#xff0c;让你专注于核心业务&#xff0c;实现更高的效率和利润。 特点&#xff1a;无需开发&#xff0c;开箱即用&#xff0c;统一管理支付订单…

【运动规划】191 自适应跟踪kinodynamicrrt的路径

分层法&#xff1a; two layer approach 自适应控制&#xff0c;跟随轨迹。运动规划&#xff1a;扩展自由空间&#xff08;基于速度约束缩小自由空间&#xff09;为控制部分留余量&#xff0c;确保安全。 控制设计&#xff1a; 考虑平移和旋转&#xff0c;速度环控制&#xff…

什么是多要素自动气象监测设备?

WX-CQ12 随着科技的发展&#xff0c;我们对天气的预测和监测能力也在不断提高。其中&#xff0c;多要素自动气象监测设备正成为一种革命性的工具&#xff0c;帮助我们更好地理解和预测天气变化。 一、什么是多要素自动气象监测设备&#xff1f; 多要素自动气象监测设备是一种…

查看sql语句执行计划并重建索引

晚上cpu报警显示当前cpu使用率达到90%以上&#xff0c;不到10%的空闲 先查询当前sql&#xff1a; #&#xff08;ORACLE&#xff09; SQL > set line 200 pages 1000 col event for a30 col program for a30 col username for a12 col sql_id for a15 col INST_ID for 9999 …

【数据结构初阶(4)】栈的基本操作实现

文章目录 Ⅰ 概念及结构1. 栈的概念2. 栈的操作 Ⅱ 基本操作实现1. 栈的定义2. 初始化栈3. 元素入栈4. 元素出栈5. 获取栈顶元素6. 获取栈中有效元素个数7. 判断栈空8. 销毁栈 Ⅰ 概念及结构 1. 栈的概念 栈&#xff1a;栈是一种特殊的线性表&#xff0c;其只允许在固定的一端…