opencv reshape函数详解
在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函数详解相关推荐
- opencv imshow函数详解
前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...
- opencv warpAffine()函数详解 -- 图像旋转与平移
简述 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rotations ...
- Opencv imshow 函数详解
官方文档:imshow.namedWindow等 本来想看看imshow的窗口是否可以隐藏菜单栏,看完官方文档感觉是不可以了. imshow imshow的输入参数如下: void cv::imsho ...
- 图像处理笔记(2)---- OpenCV imread函数详解
imread()读取图片文件,imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种: cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1. ...
- OpenCV 图像卷积:cv.filter2D() 函数详解
API 照例,我们搬一下官网的 API: C++ void cv::filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kern ...
- Opencv中的imshow函数详解
前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...
- OpenCV 图像缩放:cv.resize() 函数详解
目录 系列前言 API 函数详解 参数列表 缩放方式其一 缩放方式其二 两种方式的优先级 关于插值方式 扩展 -- 相关函数 系列前言 这个系列是我第一个想要更下去的系列.每篇会全面介绍一个 Open ...
- 【OpenCV 4开发详解】深度神经网络应用实例
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】可分离滤波
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
最新文章
- String中的hashcode缓存以及HashMap中String作key的好处
- 【网络爬虫】BeautfulSoup爬百度百科(真の能看懂~!)
- java 入门-helloWorld
- kali安装步骤失败 选择并安装软件_Pycharm2019.3.3软件安装步骤
- maven配置tomcat7
- 新疆微软.NET技术俱乐部7月活动图文报道
- 单表的更新UPDATE和删除记录DELETE(二十六)
- 如何运用机器学习预测供应链需求,时间序列数据如何处理?
- Lua介绍极其在C#项目中的应用
- 405.十六进制数 (力扣leetcode) 博主可答疑该问题
- 分享谷歌SEO的32个实用关键词拓展工具
- word把选择答案弄到题目里_将Word解答中的答案项批量填入题干
- html打开页面时在img标签加域名,Html中的img标签 加载失败
- Python3程序设计编程题解
- 毕业设计 基于51单片机老人防跌倒GSM短信报警系统
- 201671010457 朱石景 实验四《英文文本词频统计分析》 结对项目报告
- Linux系统之安装PDF阅读器
- ubuntu下rsync两个服务器同步文件
- 笨方法学python 习题14
- 多传感器融合综述---FOV与BEV
热门文章
- 【[SCOI2010]序列操作】
- SQL 利用merge 同步数据库之间表的数据
- spring boot 文件上传工具类(bug 已修改)
- 【BZOJ】3524 [POI2014] Couriers(主席树)
- [hdu 1561] The more, The Better
- Linux 的数字权限意义
- map 小模板~~~ 写的不好 继续添加
- SharePoint 2013 配置开发环境,需安装VS2012插件
- C#条件判断-根据条件判断要走的路-if结构
- 挨踢人生路--记我的10年18家工作经历 - 后记