【NCNN】NCNN中Mat的crop与resize方法

从图片中心抠图

!(https://img-blog.csdnimg.cn/bcb9bc7a8e9c49c19535c51e8c670d1d.png)

ncnn::Mat in = ncnn::Mat::from_pixels_roi(im.data, ncnn::Mat::PIXEL_RGB, im_w, im_h, x, y, roiw, roih);

抠图后进一步缩放

在这里插入图片描述

ncnn::Mat in = ncnn::Mat::from_pixels_roi_resize(im.data, ncnn::Mat::PIXEL_RGB, im_w, im_h, x, y, roiw, roih, target_w, target_h);

导出图片并错位粘贴

在这里插入图片描述
im是背景图片。

const unsigned char* data = im.data + (y * im_w + x) * 3;
out.to_pixels(data, ncnn::Mat::PIXEL_RGB, im_w * 3);

要求背景图更大,im_w * 3是每行补边的字节数。
这段代码是为了将一个ncnn::Mat对象out中的像素数据从一个具有3个通道的图像数据im中提取出来,并实现贴图的效果。
首先,代码中的data是一个指向图像数据im的指针。通过计算 y * im_w + x 可以定位到图像中特定位置的像素索引,然后乘以3是因为每个像素有3个通道(R、G、B)。因此,data 指针会指向目标像素的起始位置。
接下来,通过调用 out.to_pixels() 函数,将提取到的像素数据填充到ncnn::Mat对象out中。这个函数会将像素数据重新排列,并根据指定的像素格式(这里是PIXEL_RGB)进行转换。最后一个参数 im_w * 3 是指定每行的字节数,即图像数据im中每行的字节数。
通过以上操作,可以将图像数据im中指定位置的像素数据提取出来,并填充到ncnn::Mat对象out中,从而实现贴图的效果。

附加缩放功能

在这里插入图片描述

const unsigned char* data = im.data + (y * im_w + x) * 3;
out.to_pixels_resize(data, ncnn::Mat::PIXEL_RGB, roiw, roih, im_w * 3);

双线性插值抠图加缩放

在这里插入图片描述

const unsigned char* data = im.data + (y * im_w + x) * 3;
ncnn::resize_bilinear_c3(data, roiw, roih, im_w * 3, outdata, target_w, target_h, target_w * 3);

双线性插值贴图

在这里插入图片描述

unsigned char* outdata = im.data + (y * im_w + x) * 3;
ncnn::resize_bilinear_c3(data, w, h, w * 3, outdata, roiw, roih, im_w * 3);

data:输入图像的数据指针,类型为const unsigned char*,指向图像数据的起始位置。

w:输入图像的宽度,表示图像的列数。

h:输入图像的高度,表示图像的行数。

w * 3:输入图像每行的字节数,即图像数据的步长。

outdata:输出图像的数据指针,类型为unsigned char*,指向输出图像数据的起始位置。

roiw:输出图像的宽度,表示输出图像的列数。

roih:输出图像的高度,表示输出图像的行数。

im_w * 3:输出图像每行的字节数,即输出图像数据的步长。
该函数将输入图像data按照给定的宽高进行缩放,并将结果存储在outdata中。输入图像的通道数为3,因此每行的字节数是w * 3。输出图像的通道数也为3,因此输出图像每行的字节数是im_w * 3。函数使用双线性插值方法来进行图像的缩放,保持图像的平滑度和细节。

复合操作:抠图加贴图

在这里插入图片描述

const unsigned char* data = im.data + (y * im_w + x) * 3;
unsigned char* outdata = outim.data + (roiy * outim_w + roix) * 3;
ncnn::resize_bilinear_c3(data, w, h, im_w * 3, outdata, target_w, target_h, outim_w * 3);

这段代码实现了将输入图像im中指定位置的像素数据,经过双线性插值的方式,缩放并存储到输出图像outim的指定位置。
首先,代码中的data是一个指向输入图像im中特定位置像素数据的指针。通过计算(y * im_w + x) * 3可以定位到输入图像中特定位置的像素索引,乘以3是因为每个像素有3个通道(R、G、B)。因此,data指针会指向输入图像中目标像素的起始位置。
接下来,outdata是一个指向输出图像outim中特定位置像素数据的指针。通过计算(roiy * outim_w + roix) * 3可以定位到输出图像中特定位置的像素索引,乘以3是因为每个像素有3个通道(R、G、B)。因此,outdata指针会指向输出图像中目标像素的起始位置。
最后,通过调用ncnn::resize_bilinear_c3()函数,将输入图像data按照给定的宽高缩放,并将结果存储在输出图像outdata中。输入图像的宽度为w,高度为h,每行的字节数为im_w * 3。输出图像的宽度为target_w,高度为target_h,每行的字节数为outim_w * 3。函数使用双线性插值方法来进行图像的缩放,以保持图像的平滑度和细节。
通过以上操作,可以将输入图像im中指定位置的像素数据,经过双线性插值的方式,缩放并存储到输出图像outim的指定位置。

猜你喜欢

转载自blog.csdn.net/hh1357102/article/details/131897119