函数原型
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; }
测试效果
图1 生成矩阵数据
在result1中,通道数为0就是与pic通道数1一致的意思,所以result1和result2都是图2所示。
图2 变形后矩阵
result3中,通道数设为3,行数也为3,那么变形后的矩阵就是一个3*1的3通道矩阵,如图3所示。
图3 变形后的三通道矩阵
若是设置为2通道的3行矩阵,9不能整除6,就会报错;同理,如果设置3通道的3行矩阵,数据量一定是9的倍数才可以。不然就会出现如图4所示的异常中断提示。
图4 异常提示
这个函数起初我以为是输入行和列,结果后来发现第一个参数是通道数,第二个参数是行数,大意了,所以特此写篇小文章注明下,望后来者避坑。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!