1. 程式人生 > >OpenCV中的Resize和Reshape不同

OpenCV中的Resize和Reshape不同



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?
  1. 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?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include <opencv2\opencv.hpp>
  2. usingnamespace cv;  
  3. void main()  
  4. {  
  5.     cv::Mat M = (cv::Mat_<uchar>(3,3) << 1,2,3,4,5,6,7,8,9);   
  6.     std::cout<<"原矩陣:\n"<<M<<std::endl;  
  7.     std::cout<<"mat::reshape:\n"<<M.reshape(0,1)<<std::endl;  
  8.     M.resize(2);  
  9.     std::cout<<"mat::resize:\n"<<M<<std::endl;  
  10.     cv::resize( M,M, Size(2,4) );  
  11.     std::cout<<"cv::resize:\n"<<M<<std::endl;  
  12. }  
#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;
}