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

本文主要是介绍福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实验目的

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

这篇关于福州大学《嵌入式系统综合设计》实验五:图像裁剪及尺寸变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418764

相关文章

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用