OpenCV-矩阵变形reshape

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 

函数原型

cv::Mat reshape(int cn, int rows=0) const;

参数说明

       reshape函数有3种重载形态,最常用的是上面所展示的这个原型,所以只介绍这个。

  1. int类型的cn,表示变形后的矩阵的通道数。
  2. int类型的rows,表示变形后的矩阵的行数。
  3. 返回的内容是一个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 异常提示

       这个函数起初我以为是输入行和列,结果后来发现第一个参数是通道数,第二个参数是行数,大意了,所以特此写篇小文章注明下,望后来者避坑。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

© 版权声明
THE END
喜欢就支持一下吧
点赞167 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容