先來看一下resize函數的原型,如下。
C++:
void resize
(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
輸入是要改變的圖,輸出是改變后的圖片。
通常使用時,像筆者都是計算好輸出圖片的尺寸,然后直接在dsize里面設置。比如輸入圖片是1280*960分辨率的,輸出圖片要設置為640*480,那么dsize就是Size(640,480)。
設置尺寸也可以不用dsize,而是使用fx和fy。fx和fy這兩個參數分別表示x方向和y方向的resize比例。
我們要不設置dsize,要不設置fx和fy,不可以兩個同時都為0。
輸出圖片的類型和尺寸不由輸入圖片dst這個變量來決定,而是,類型保持跟src的類型一致,尺寸由輸入圖片src的尺寸和dsize(或者fx和fx)共同決定。
參數類型有五種,具體可以參考opencv官方文檔,默認的是雙線性插值。
下面說下筆者犯的一個錯誤,可以給同學們借鑒下。
筆者想把一個(4,4)的矩陣縮放到(2,2),想采用最近鄰插值法,而不是默認的雙線性插值。
代碼如下。(錯誤代碼)
int main() { Mat a(4, 4, CV_32F); int count = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { a.at<float>(i, j) = count; count++; } } Mat dst; resize(a, dst, Size(2, 2), INTER_NEAREST); cout << a << endl; cout << dst << endl; return 0; }
上述代碼在resize的時候,選用了INTER-NEAREST,但是輸出結果卻如下所示。
這就有點奇怪了,這是雙線性插值的結果,不應該是最近鄰插值的結果。
后來看到resize函數的聲明,才突然明白過來。
resize函數的聲明在hpp里面如下。
CV_EXPORTS_W void resize( InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR );
大家發現沒有,后面的fx、fy和interpolation都有默認值,假如按照筆者上面代碼的寫法,其實我輸入的INTER_NEAREST對應的是fx,而不是interpolation。
所以改成下面這種方法就可以了,resize的輸出就對了。
int main() { Mat a(4, 4, CV_32F); int count = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { a.at<float>(i, j) = count; count++; } } Mat dst; resize(a, dst, Size(2, 2), 0, 0, INTER_NEAREST); cout << a << endl; cout << dst << endl; return 0; }
輸出如下。