轉載請著名出處與作者
OpenCV提供了一個實現圖像縮放的函數:cv::resize
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
dsize為縮放目的的寬度和高度信息.如果此參數為0(可以使用cv::Size()得到0 size),則根據fx和fy計算獲取.
fx與fy為寬度和高度的縮放比例.如果此參數為0則根據dsize計算獲取.
注意:resize的結果與dsize,fx,fy有關,與dst的預設值沒有關係,函數會重置dst的大小.
interpolation為縮放時填充的類型,默認情況下是雙線性填充.有下面的值可以選擇:
INTER_NEAREST 臨近元素插值法,
INTER_LINEAR 雙線性差值法,
INTER_CUBIC 立方差值法,
INTER_AREA 像素關係重採樣法,縮小圖像的時候此法可避免波紋出現,
INTER_LANCZOS4 lanczos4插入法
類中的函數如下:
//!伸縮圖片,ROI會被重置為整個新圖片,Resize函數針對整個圖片進行處理.
//!rate為伸縮比率.interpolation為填充類型,可以為下面的值:
//!INTER_NEAREST 臨近元素插值法, INTER_LINEAR 雙線性差值法, INTER_CUBIC 立方差值法,INTER_AREA 像素關係重採樣法,縮小圖像的時候此法可避免波紋出現,INTER_LANCZOS4 lanczos4插入法
bool Resize(double rate,int interpolation);
//!伸縮圖片,ROI會被重置為整個新圖片,s為新圖像的寬高.
bool Resize(const cv::Size &s,int interpolation);
//!伸縮圖片,ROI會被重置為整個新圖片,width為新圖像的寬,height為新圖像的高.
bool Resize(int width,int height ,int interpolation);
//!伸縮圖片,ROI會被重置為整個新圖片,width為新圖像的寬.此函數會鎖定長寬比,按比例根據寬度值縮放圖片.
bool Resize(int width,int interpolation);
bool COpenCVImage::Resize(double rate,int interpolation)
{
cv::resize(m_src,m_src,cv::Size(),rate,rate,interpolation);
SetWholeAsROI();
m_modifyed_for_draw=true;
return true;
}
bool COpenCVImage::Resize(const cv::Size &s,int interpolation)
{
cv::resize(m_src,m_src,cv::Size(s),0,0,interpolation);
SetWholeAsROI();
m_modifyed_for_draw=true;
return true;
}
bool COpenCVImage::Resize(int width,int height ,int interpolation)
{
return Resize(cv::Size(width,height),interpolation);
}
bool COpenCVImage::Resize(int width,int interpolation)
{
return Resize(width,(int)(((double)m_src.rows)*((double)width/(double)m_src.cols)+0.5), interpolation);
}