OpenCV Resize Reshape

本文详细介绍了OpenCV中三种常见的矩阵操作方法:Mat::reshape()用于逻辑上改变矩阵的行列数或通道数;Mat::resize()用于改变矩阵的行数,并可能引起矩阵的重新分配;cv::resize()通过插值方式改变图像尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Mat::reshape( ) 

只是在逻辑上改变矩阵的行列数或者通道数,没有任何的数据的复制,也不会增减任何数据,因此这是一个O(1)的操作,它要求矩阵是连续的。

C++: Mat Mat::reshape(int cn, int rows=0 const)

cn:目标通道数,如果是0则保持和原通道数一致;

rows:目标行数,同上是0则保持不变;

改变后的矩阵要满足 rows*cols*channels  跟原数组相等,所以如果原来矩阵是单通道3*3的,调用Reshape(0,2)是会报错的,因为3*3*1不能被2*1整除。

应用:在提取特征时,往往需要把特征矩阵变成一个行向量
  1. return feature.reshape(0,1).clone();  


2. Mat::Resize( )

是改变矩阵的行数,会引起矩阵的重新分配。

C++: void Mat::resize(size_t sz)

C++: void Mat::resize(size_t sz, const Scalar& s)

sz:目标行数

s :如果sz大于原来函数,可以选择填充值


3.cv::resize( )

这个是通过插值的方式来改变图像的尺寸,貌似不支持int型的元素,uchar,float和double都可以。

C++: void resize( InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

dst的尺寸是由dsize,fx和fy决定的,与dst本身的type和size都没有关系。

当size不为0时,可以直接确定dst的大小,这时的fx和fy可以设为0;

当size为0时,fx代表宽度(列)的缩放系数,fy代表高度(行)的缩放系数,这时dsize可以写成Size(),它将默认设置为

     dsize = Size(round(fx*src.cols), round(fy*src.rows));

举例说明一下:

#include <opencv2\opencv.hpp>  
using namespace cv;  
void main()  

cv::Mat M = (cv::Mat_<uchar>(2,3) << 1,2,3,4,5,6);//原则:先行后列
       std::cout<<"原矩阵:\n"<<M<<std::endl;
       std::cout<<"mat::reshape:\n"<<M.reshape(0,1)<<std::endl;
       M.resize(2);
       std::cout<<"mat::resize:\n"<<M<<std::endl;
       cv::resize( M,M, Size(2,4) );
       std::cout<<"cv::resize:\n"<<M<<std::endl;

}

结果:  

[ 1, 2, 3;

4, 5, 6]

mat::reshape:

[ 1, 2, 3, 4, 5, 6]

mat::resize:

[ 1, 2, 3;

4, 5, 6]

cv::resize:

[ 1, 3;

2, 3;

3, 5;

4, 6]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值