1.reshape函数
1.作用:
在opencv中,reshape函数可以重新调整图像矩阵的行数、列数、通道数。
2.ORB-SLAM2涉及的代码段:
在OREB-SLAM2中frame.cc源文件中UndistortKeyPoints()函数中有这样的一个代码段,其中涉及了reshape函数,代码段如下:
cpp
// Undistort points
mat=mat.reshape(2);
cv::undistortPoints(mat,mat,mK,mDistCoef,cv::Mat(),mK);
mat=mat.reshape(1);
解释:该部分代码讲的是对提取的ORB特征点进行去畸变,它先对矩阵进行reshape(2)变成双通道矩阵之后调用undistortPoints()函数对矩阵进行去畸变,在对矩阵进行reshape(1)变成单通道矩阵。
3.reshape函数原型(C++):
cpp
cv::Mat cv::Mat::reshape(int channels, int rows=0) const
参数:
1.channels:
要将矩阵重塑成的通道数,如果设为0,则表示保持通道数不变,否则则变为设置的通道数。
2.rows(可选):要将矩阵重塑成的行数,如果设为0,则表示保持原有的行数不变,否则则变为设置的行数。
2.实例
1.初始矩阵:
一个2行4列1通道的一个矩阵
代码:
cpp
int main()
{
Mat data = Mat(2, 4, CV_32F); //设置一个2行4列1通道的一个矩阵
cout << "行数: " << data.rows << endl;
cout << "列数: " << data.cols << endl;
cout << "通道: " << data.channels() << endl;
return 0;
输出结果:
cpp
行数: 2
列数: 4
通道: 1
2.reshape(2);
输出结果:
cpp
行数: 2
列数: 2
通道: 2
3.总结:
1.变化的恒等式:rows * cols * channels(前) = rows * cols * channels(后)。
2.利用reshape()函数我们能够改变通道数和行数(可选),列数自动计算。
3.需要注意能否得到所需的通道数,以上述例子为例,若想要三通道则会出错。
4.实践
假设有一个 2 行 4 列的单通道矩阵,其形式如下:
cpp
1 2 3 4
5 6 7 8
试计算reshape(2)的形式?答案我放在评论区,做完看看是不是和你的答案是不是一样。
5.结束语
以上就是reshape ()函数的全部内容,希望对大家有帮助,请给我一键三连吧,您的支持是我前进的动力!