OpenCV中的Resize和Reshape不同
阿新 • • 發佈:2019-01-05
[cpp] view plaincopyprint?3.cv::resize( )
OpenCV中的Resize和Reshape都是改變一個矩陣的形狀,那它們有哪些不同點呢?
1. Mat::reshape( )
只是在邏輯上改變矩陣的行列數或者通道數,沒有任何的資料的複製,也不會增減任何資料,因此這是一個O(1)的操作,它要求矩陣是連續的。
應用:在提取特徵時,往往需要把特徵矩陣變成一個行向量C++: Mat Mat::reshape(int cn, int rows=0 const)
cn:目標通道數,如果是0則保持和原通道數一致;
rows:目標行數,同上是0則保持不變;
改變後的矩陣要滿足 rows*cols*channels 跟原陣列相等,所以如果原來矩陣是單通道3*3的,呼叫Reshape(0,2)是會報錯的,因為3*3*1不能被2*1整除。
[cpp] view plaincopyprint?
- return feature.reshape(0,1).clone();
return feature.reshape(0,1).clone();
2. Mat::Resize( )
是改變矩陣的行數,會引起矩陣的重新分配。
C++: void Mat::resize(size_t sz)
C++: void Mat::resize(size_t sz, const Scalar& s)
sz:目標行數
s :如果sz大於原來函式,可以選擇填充值
3.cv::resize( )
這個是通過插值的方式來改變影象的尺寸,貌似不支援int型的元素,uchar,float和double都可以。
C++: void resize( InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
dst的尺寸是由dsize,fx和fy決定的,與dst本身的type和size都沒有關係。
當size不為0時,可以直接確定dst的大小,這時的fx和fy可以設為0;
當size為0時,fx代表寬度(列)的縮放係數,fy代表高度(行)的縮放係數,這時dsize可以寫成Size(),它將預設設定為
dsize = Size(round(fx*src.cols), round(fy*src.rows));
舉例說明一下:
[cpp] view plaincopyprint?- #include <opencv2\opencv.hpp>
- usingnamespace cv;
- void main()
- {
- cv::Mat M = (cv::Mat_<uchar>(3,3) << 1,2,3,4,5,6,7,8,9);
- std::cout<<"原矩陣:\n"<<M<<std::endl;
- std::cout<<"mat::reshape:\n"<<M.reshape(0,1)<<std::endl;
- M.resize(2);
- std::cout<<"mat::resize:\n"<<M<<std::endl;
- cv::resize( M,M, Size(2,4) );
- std::cout<<"cv::resize:\n"<<M<<std::endl;
- }
#include <opencv2\opencv.hpp>
using namespace cv;
void main()
{
cv::Mat M = (cv::Mat_<uchar>(3,3) << 1,2,3,4,5,6,7,8,9);
std::cout<<"原矩陣:\n"<<M<<std::endl;
std::cout<<"mat::reshape:\n"<<M.reshape(0,1)<<std::endl;
M.resize(2);
std::cout<<"mat::resize:\n"<<M<<std::endl;
cv::resize( M,M, Size(2,4) );
std::cout<<"cv::resize:\n"<<M<<std::endl;
}