先来看一下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; }
输出如下。