做系统和做网站哪个简单一些,安监局网站做应急预案备案,用ip地址做网站,制作网页哪家好一、实验目的
在深度学习中#xff0c;往往需要从一张大图中裁剪出一张张小图#xff0c;以便适应网络输入图像的尺寸#xff0c;这可以通过bmcv_image_crop函数实现。 实践中#xff0c;经常需要对输入图像的尺寸进行调整#xff0c;以适用于网络输入图片尺寸#xff0…一、实验目的
在深度学习中往往需要从一张大图中裁剪出一张张小图以便适应网络输入图像的尺寸这可以通过bmcv_image_crop函数实现。 实践中经常需要对输入图像的尺寸进行调整以适用于网络输入图片尺寸这可以通过bmcv提供的resize函数实现。目标检测时需要将检测到的目标位置用矩形框出来这可以通过bmcv_image_draw_rectangle函数实现。本实验的目的是掌握算能的BMCV函数bmcv_image_crop, bmcv_image_resizebmcv_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_rpadding_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表示线宽rgb为所绘制线条三原色的值。
在代码中调用方式如下
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中可以直接通过对图像长、宽维度进行操作以实现图像剪裁的效果如下所示
dstsrc[200:2560,300:2062]
OpenCV提供resize函数可以用于图像尺寸缩放其函数接口如下所示
void resize (InputArray src,OutputArray dst,Size dsize,double fx0, double fy0,int interpolationINTER_LINEAR)
其中src是原图dst是输出结果图fx表达横向的放缩倍数fy表达纵向的放缩倍数dsize表达放缩后的图像的横和纵向长度interpolation为插值方式。
其调用方式如下图所示。
resize(src, dst, Size(), 0.5, 0.5, interpolation);
OpenCV提供rectangle函数以实现在输入图像img上画出一个矩形此时矩形通过左上角的点和右下角的点坐标pt1pt2 表示。 函数参数含义与
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盒子中即可实现对图片的裁剪。 root06416e512cb7:/tmp/crop# chmod 777 bmcv_crop root06416e512cb7:/tmp/crop# ./bmcv_crop cutecat.jpeg open /dev/jpu successfully,device index 0 jpu fd 8,vpp fd 9 效果如下 rootb3e319d8a0c8:~/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文件夹内的文件如图所示 rootb3e319d8a0c8:~/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如图所示
给可执行文件赋权限并执行 root06416e512cb7:/tmp/crop# chmod 777 bmcv_resize root06416e512cb7:/tmp/crop# ./bmcv_resize greycat.jpeg bmcv Open /dev/jpu successfully,device index 0,jpu fd 8,vpp fd 9 root06416e512cb7:/tmp/crop# ./bmcv_resize greycat.jpeg opencv Open /dev/jpu successfully,device index 0,jpu fd 4,vpp fd 5 执行结果如下所示生成out.jpg rootb3e319d8aoc8:~/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
类似地执行画矩形框的代码可画出矩形框具体如下 root06416e512cb7 : /tmp/crop# chmod 777 bmcv_ drawrect root06416e512cb7:/tmp/crop# ./bmcv_drawrect greycat.jpeg bmcv Open /dev/jpu successfully,device index 0, jpu fd 4,vpp fd 5 执行结果如下所示生成out.jpg rootb3e319d8a0c8:~/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 rootb3e319d8a0c8:~/bmnnsdk2-bm1684_v2.7.0/examples/bmcv_drawrect# 生成的结果out.jpg如上图所示。