resize( InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR );使用fx,fy的实例
时间: 2024-02-14 13:11:22 浏览: 143
下面是一个使用fx和fy来指定输出图像的缩放比例的示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("test.jpg"); // 读取图像
Mat resizedImage;
double fx = 0.5; // 水平方向缩放比例
double fy = 0.5; // 垂直方向缩放比例
resize(image, resizedImage, Size(), fx, fy, INTER_LINEAR); // 缩放图像
imshow("Original Image", image);
imshow("Resized Image", resizedImage);
waitKey(0);
return 0;
}
```
这个程序使用了fx和fy来指定输出图像的缩放比例,将水平和垂直方向的大小都缩小到原来的一半。在resize函数中,我们将输出图像的大小指定为空(Size()),然后使用fx和fy来指定缩放比例。
相关问题
resize( InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR );
这是OpenCV中resize函数的定义。它有6个参数:
- src:输入图像。
- dst:输出图像。
- dsize:输出图像的大小,也可以使用fx和fy来指定输出图像的缩放比例。
- fx:水平方向的缩放比例。
- fy:垂直方向的缩放比例。
- interpolation:插值算法,可以是INTER_NEAREST(最近邻插值)、INTER_LINEAR(双线性插值)、INTER_CUBIC(双三次插值)等。
resize函数的作用是改变图像的大小,可以实现图像的缩放、放大等操作。在调用resize函数时,需要传递输入图像和输出图像,以及指定输出图像的大小或缩放比例。另外,还可以选择不同的插值算法来实现图像的缩放,以达到更好的图像质量。
opencv中resize函数的源码
下面是OpenCV中`resize`函数的源码:
```cpp
void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx, double fy, int interpolation)
{
CV_INSTRUMENT_REGION();
CV_Assert( (src.depth() == CV_8U || src.depth() == CV_32F) && src.channels() <= 4 );
if( interpolation == INTER_AREA && fx > 1 && fy > 1 )
{
fx = 1./fx;
fy = 1./fy;
std::swap(dsize.width, dsize.height);
interpolation = INTER_AREA_RESCALE;
}
if( interpolation == INTER_CUBIC || interpolation == INTER_LANCZOS4 )
{
fx = saturate_cast<double>(dsize.width)/src.cols;
fy = saturate_cast<double>(dsize.height)/src.rows;
}
if( fx == 0 || fy == 0 )
{
dst.release();
return;
}
CV_Assert( (dsize.width > 0 || dsize.height > 0) && (fx > 0 || fy > 0) );
Mat srcMat = src.getMat();
if( srcMat.data == dst.getMat().data )
{
Mat temp;
resize(srcMat, temp, dsize, fx, fy, interpolation);
dst.assign(temp);
return;
}
dst.create(_resize(srcMat, dsize, fx, fy, interpolation));
}
```
这个函数的实现比较简单,主要是对输入参数进行检查,然后调用了`_resize`函数完成实际的图像缩放操作。在调用`_resize`函数之前,还对一些特殊情况进行了处理,比如当插值方法为`INTER_AREA`时,会先对图像进行缩小再进行放大,以提高放大效果。当插值方法为`INTER_CUBIC`或`INTER_LANCZOS4`时,会根据目标大小和原始图像大小计算出缩放比例`fx`和`fy`。
下面是`_resize`函数的源码:
```cpp
static Mat _resize(InputArray _src, Size dsize, double fx, double fy, int interpolation)
{
CV_INSTRUMENT_REGION()
int depth = _src.depth(), cn = _src.channels();
if( _src.isContinuous() && !(dsize.width == 0 && dsize.height == 0) )
{
dsize.width = dsize.width > 0 ? dsize.width : cvRound(_src.cols*fx);
dsize.height = dsize.height > 0 ? dsize.height : cvRound(_src.rows*fy);
if( (dsize.width == _src.cols && dsize.height == _src.rows) ||
(dsize.width == 0 && dsize.height == 0) )
{
return _src.getMat().clone();
}
if( cn == 1 || cn == 3 || cn == 4 )
{
Mat src = _src.getMat();
Mat dst(dsize, CV_MAKETYPE(depth, cn));
if( interpolation == INTER_NEAREST )
{
resize_nn<uchar, Vec3b, ResizeNoVec>(src, dst, fx, fy);
}
else if( interpolation == INTER_LINEAR || interpolation == INTER_CUBIC || interpolation == INTER_LANCZOS4 )
{
if( interpolation == INTER_LINEAR )
resize_<uchar, Vec3b, INTER_LINEAR>(src, dst, fx, fy);
else if( interpolation == INTER_CUBIC )
resize_<uchar, Vec3b, INTER_CUBIC>(src, dst, fx, fy);
else if( interpolation == INTER_LANCZOS4 )
resize_<uchar, Vec3b, INTER_LANCZOS4>(src, dst, fx, fy);
}
else if( interpolation == INTER_AREA || interpolation == INTER_AREA_RESCALE )
{
if( interpolation == INTER_AREA )
resize_area<uchar, Vec3b, ResizeNoVec>(src, dst, fx, fy);
else
resize_area<uchar, Vec3b, ResizeNoVec, AreaFast>(src, dst, fx, fy);
}
else if( interpolation == INTER_CUBIC2P_LINEAR )
resize_<uchar, Vec3b, INTER_CUBIC2P_LINEAR>(src, dst, fx, fy);
else if( interpolation == INTER_CUBIC2P )
resize_<uchar, Vec3b, INTER_CUBIC2P>(src, dst, fx, fy);
else if( interpolation == INTER_NEAREST_NEIGHBOUR_EX )
resize_nn<uchar, Vec3b, ResizeExpanse>(src, dst, fx, fy);
else if( interpolation == INTER_LINEAR_EX )
resize_<uchar, Vec3b, INTER_LINEAR_EX>(src, dst, fx, fy);
else if( interpolation == INTER_CUBIC_EX )
resize_<uchar, Vec3b, INTER_CUBIC_EX>(src, dst, fx, fy);
else if( interpolation == INTER_LANCZOS4_EX )
resize_<uchar, Vec3b, INTER_LANCZOS4_EX>(src, dst, fx, fy);
else
CV_Error(Error::StsUnsupportedFormat, "");
return dst;
}
}
Mat src = _src.getMat();
return resizeGeneric(src, dsize, fx, fy, interpolation);
}
```
这个函数根据输入参数的不同,选择不同的缩放方法进行图像缩放。具体而言,它包含了多个重载函数`resize_`和`resize_area`,分别对应了不同的插值方法。其中`resize_`函数是实现了线性、双三次和Lanczos插值方法的通用缩放函数;`resize_nn`函数是实现了最近邻插值方法的通用缩放函数;`resize_area`函数是实现了像素面积关系插值方法的通用缩放函数。这些函数的具体实现可以参考OpenCV源码。
阅读全文