作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
函数原型
cv::Mat reshape(int cn, int rows=0) const;
参数说明
reshape函数有3种重载形态,最常用的是上面所展示的这个原型,所以只介绍这个。
- int类型的cn,表示变形后的矩阵的通道数。
- int类型的rows,表示变形后的矩阵的行数。
- 返回的内容是一个cv::Mat,表示变形后的矩阵。
测试代码
#include<iostream>
#include<fstream>
#include<opencv2/opencv.hpp>
using namespace std;
int main()
{
cv::Mat pic = cv::Mat::zeros(9, 1, CV_32FC1);
for (int i = 0; i < pic.rows; i++)
{
for (int j = 0; j < pic.cols; j++)
{
pic.at<float>(i, j) = rand() % 255;
}
}
// 以下变化后的矩阵行数均为3
// 第一参数为0时,默认与pic同样的通道数,都是1
cv::Mat result1 = pic.reshape(0, 3);
// 第一参数为1时,设置result2的通道数为1
cv::Mat result2 = pic.reshape(1, 3);
// 第一参数为3时,设置result2的通道数为3
cv::Mat result3 = pic.reshape(3, 3);
// 第一个参数为2时,设置通道数为2,此时行数为3,和9不能整除,看看会发生什么
//cv::Mat result4 = pic.reshape(2, 3);
return 0;
}
测试效果

在result1中,通道数为0就是与pic通道数1一致的意思,所以result1和result2都是图2所示。

result3中,通道数设为3,行数也为3,那么变形后的矩阵就是一个3*1的3通道矩阵,如图3所示。

若是设置为2通道的3行矩阵,9不能整除6,就会报错;同理,如果设置3通道的3行矩阵,数据量一定是9的倍数才可以。不然就会出现如图4所示的异常中断提示。

这个函数起初我以为是输入行和列,结果后来发现第一个参数是通道数,第二个参数是行数,大意了,所以特此写篇小文章注明下,望后来者避坑。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容