opencv2.4.13.7的resize函數使用(c++)


先來看一下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;
}

 

輸出如下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM