在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数。

函数原型:

C++: Mat Mat::reshape(int cn, int rows=0) const
参数比较少,但设置的时候却要千万小心。

cn: 表示通道数(channels), 如果设为0,则表示保持通道数不变,否则则变为设置的通道数。

rows: 表示矩阵行数。 如果设为0,则表示保持原有的行数不变,否则则变为设置的行数。

首先设置一个初始矩阵:一个20行30列1通道的一个矩阵

int main()
{Mat data = Mat(20, 30, CV_32F);  //设置一个20行30列1通道的一个矩阵cout << "行数: " << data.rows << endl;cout << "列数: " << data.cols << endl;cout << "通道: " << data.channels() << endl;system("pause");return 1;
}

输出:

第一次变化:通道数不变,将矩阵序列化1行N列的行向量
int main()
{Mat data = Mat(20, 30, CV_32F);  //设置一个20行30列1通道的一个矩阵cout << "行数: " << data.rows << endl;cout << "列数: " << data.cols << endl;cout << "通道: " << data.channels() << endl;cout << endl;Mat dst = data.reshape(0, 1);cout << "行数: " << dst.rows << endl;cout << "列数: " << dst.cols << endl;cout << "通道: " << dst.channels() << endl;system("pause");return 1;
}

输出:

第二次变化:通道数不变,将矩阵序列化N行1列的列向量
int main()
{Mat data = Mat(20, 30, CV_32F);  //设置一个20行30列1通道的一个矩阵cout << "行数: " << data.rows << endl;cout << "列数: " << data.cols << endl;cout << "通道: " << data.channels() << endl;cout << endl;Mat dst = data.reshape(0, data.rows*data.cols);cout << "行数: " << dst.rows << endl;cout << "列数: " << dst.cols << endl;cout << "通道: " << dst.channels() << endl;system("pause");return 1;
}


可见,序列成列向量比行向量要麻烦一些,还得去计算出需要多少行。但我们可以先序列成行向量,再转置

第三次变化:通道数由1变为2,行数不变
int main()
{Mat data = Mat(20, 30, CV_32F);  //设置一个20行30列1通道的一个矩阵cout << "行数: " << data.rows << endl;cout << "列数: " << data.cols << endl;cout << "通道: " << data.channels() << endl;cout << endl;Mat dst = data.reshape(2, 0);cout << "行数: " << dst.rows << endl;cout << "列数: " << dst.cols << endl;cout << "通道: " << dst.channels() << endl;system("pause");return 1;
}


从结果可以看出,列数被分出一半,放在第二个通道里去了。

同理,如果通道数由1变为3,行数不变。则每通道的列数变为原来的三分之一。

需要注意的是,如果行保持不变,改变的通道数一定要能被列数整除,否则会出错。

第四次变化:通道数由1变为2,行数变为原来的五分之一
int main()
{Mat data = Mat(20, 30, CV_32F);  //设置一个20行30列1通道的一个矩阵cout << "行数: " << data.rows << endl;cout << "列数: " << data.cols << endl;cout << "通道: " << data.channels() << endl;cout << endl;Mat dst = data.reshape(2, data.rows/5);cout << "行数: " << dst.rows << endl;cout << "列数: " << dst.cols << endl;cout << "通道: " << dst.channels() << endl;system("pause");return 1;
}


可见,不管怎么变,都遵循这样一个等式:

变化之前的 rowscolschannels = 变化之后的 rowscolschannels

我们只能改变通道数和行数,列数不能改变,它是自动变化的。

但是要注意的是,在变化的时候,要考虑到是否整除的情况。如果改变的数值出现不能整除,就会报错。

opencv在序列化的时候是行序列化还是列序列化呢?

我们知道,在matlab里面,是列序列化, 即取值为从上到下,从左到右,opencv又是怎么样的呢

int main()
{Mat data = (Mat_<int>(2, 3) << 1, 2, 3, 10, 20, 30);  //2行3列的矩阵cout << data << endl;Mat dst1 = data.reshape(0, 6);   //通道不变,序列成列向量cout <<endl<< dst1 << endl;Mat dst2 = data.reshape(0, 1);   //通道不变,序列成行向量cout << endl << dst2 << endl;system("pause");return 1;
}


从结果看出,不管是变化成行向量还是列向量,opencv都是行序列化,即从左到右,从上到下,与matlab是不一样的。

opencv reshape函数详解相关推荐

  1. opencv imshow函数详解

    前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...

  2. opencv warpAffine()函数详解 -- 图像旋转与平移

    简述 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rotations ...

  3. Opencv imshow 函数详解

    官方文档:imshow.namedWindow等 本来想看看imshow的窗口是否可以隐藏菜单栏,看完官方文档感觉是不可以了. imshow imshow的输入参数如下: void cv::imsho ...

  4. 图像处理笔记(2)---- OpenCV imread函数详解

    imread()读取图片文件,imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种: cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1. ...

  5. OpenCV 图像卷积:cv.filter2D() 函数详解

    API 照例,我们搬一下官网的 API: C++ void cv::filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kern ...

  6. Opencv中的imshow函数详解

    前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...

  7. OpenCV 图像缩放:cv.resize() 函数详解

    目录 系列前言 API 函数详解 参数列表 缩放方式其一 缩放方式其二 两种方式的优先级 关于插值方式 扩展 -- 相关函数 系列前言 这个系列是我第一个想要更下去的系列.每篇会全面介绍一个 Open ...

  8. 【OpenCV 4开发详解】深度神经网络应用实例

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】可分离滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. String中的hashcode缓存以及HashMap中String作key的好处
  2. 【网络爬虫】BeautfulSoup爬百度百科(真の能看懂~!)
  3. java 入门-helloWorld
  4. kali安装步骤失败 选择并安装软件_Pycharm2019.3.3软件安装步骤
  5. maven配置tomcat7
  6. 新疆微软.NET技术俱乐部7月活动图文报道
  7. 单表的更新UPDATE和删除记录DELETE(二十六)
  8. 如何运用机器学习预测供应链需求,时间序列数据如何处理?
  9. Lua介绍极其在C#项目中的应用
  10. 405.十六进制数 (力扣leetcode) 博主可答疑该问题
  11. 分享谷歌SEO的32个实用关键词拓展工具
  12. word把选择答案弄到题目里_将Word解答中的答案项批量填入题干
  13. html打开页面时在img标签加域名,Html中的img标签 加载失败
  14. Python3程序设计编程题解
  15. 毕业设计 基于51单片机老人防跌倒GSM短信报警系统
  16. 201671010457 朱石景 实验四《英文文本词频统计分析》 结对项目报告
  17. Linux系统之安装PDF阅读器
  18. ubuntu下rsync两个服务器同步文件
  19. 笨方法学python 习题14
  20. 多传感器融合综述---FOV与BEV

热门文章

  1. 【[SCOI2010]序列操作】
  2. SQL 利用merge 同步数据库之间表的数据
  3. spring boot 文件上传工具类(bug 已修改)
  4. 【BZOJ】3524 [POI2014] Couriers(主席树)
  5. [hdu 1561] The more, The Better
  6. Linux 的数字权限意义
  7. map 小模板~~~ 写的不好 继续添加
  8. SharePoint 2013 配置开发环境,需安装VS2012插件
  9. C#条件判断-根据条件判断要走的路-if结构
  10. 挨踢人生路--记我的10年18家工作经历 - 后记