cv::GaussianBlur(...)
在这种情况下,您可以使用内核调用内核大小在两个维度上都必须是奇数:kernel.width % 2 == 1 && kernel.height % 2 == 1
。
或者您可以不设置内核大小并提供正 sigma 值(sigma1
必须设置,sigma2
默认情况下将设置为等于它)。如果是这样,内核的计算方式如下:
template <typename T>
static void createGaussianKernels( T & kx, T & ky, int type, Size &ksize,
double sigma1, double sigma2 )
{
int depth = CV_MAT_DEPTH(type);
if( sigma2 <= 0 )
sigma2 = sigma1;
// automatic detection of kernel size from sigma
if( ksize.width <= 0 && sigma1 > 0 )
ksize.width = cvRound(sigma1*(depth == CV_8U ? 3 : 4)*2 + 1)|1;
if( ksize.height <= 0 && sigma2 > 0 )
ksize.height = cvRound(sigma2*(depth == CV_8U ? 3 : 4)*2 + 1)|1;
CV_Assert( ksize.width > 0 && ksize.width % 2 == 1 &&
ksize.height > 0 && ksize.height % 2 == 1 );
...
...
}
这来自 OpenCV 4.1.1 来源。所以你的代码看起来很有效。我编译了它,它在没有断言的情况下运行,就像预期的那样。检查您使用的是哪个版本的 lib,但这是非常基本的功能,它最近几乎没有更改。
您还可以尝试同时提供sigma1
and sigma2
(并使用双精度值来避免隐式类型转换):
double sigmaX = 1.;
double sigmaY = 1.;
cv::GaussianBlur(input, smooth, cv::Size(0, 0), sigmaX, sigmaY);