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;
}

 

输出如下。

posted @ 2019-04-23 09:10  chenjx85  阅读(3590)  评论(0编辑  收藏  举报