中文 opencv cvRound函数
时间: 2023-05-28 14:08:05 浏览: 74
cvRound函数是OpenCV中的一个函数,用于将浮点数四舍五入为最接近的整数。
函数原型如下:
```cpp
int cvRound(double value);
```
参数:
- value:需要四舍五入的浮点数。
返回值:
- 返回四舍五入后的整数。
示例:
```cpp
double value = 3.6;
int roundedValue = cvRound(value);
cout << roundedValue << endl; // 输出 4
```
在OpenCV中,cvRound函数通常用于图像处理中的像素值转换,如将浮点数像素值转换为整数像素值。
相关问题
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源码。
opencv round
根据提供的引用内容,OpenCV中有三个函数可以用于舍入浮点数转换成整数:cvRound()、cvFloor()和cvCeil()。
1. cvRound()函数返回跟参数最接近的整数值,即四舍五入。它有三个重载版本,分别用于处理double、float和int类型的参数。下面是一个示例:
```cpp
double value = 3.7;
int roundedValue = cvRound(value);
// 输出:4
```
2. cvFloor()函数返回不大于参数的最大整数值,即向下取整。同样,它也有三个重载版本。下面是一个示例:
```cpp
float value = 3.7f;
int flooredValue = cvFloor(value);
// 输出:3
```
3. cvCeil()函数返回不小于参数的最小整数值,即向上取整。同样,它也有三个重载版本。下面是一个示例:
```cpp
int value = 3;
int ceiledValue = cvCeil(value);
// 输出:3
```
这些函数在OpenCV中常用于图像处理和计算机视觉任务中,可以方便地处理浮点数和整数之间的转换。