0

opencv 文档中所述,

ksize – 高斯核大小。ksize.width 和 ksize.height 可以不同,但​​它们都必须是正数和奇数。或者,它们可以是零,然后从 sigma* 计算。

我尝试将内核大小设置为 0:

Mat input = imread(inputImagePath, IMREAD_COLOR);
Mat smooth;
int sigma=1;
GaussianBlur(input, smooth, Size(0, 0), sigma);

结果是:

OpenCV(3.4.1) Error: Assertion failed (ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1) in createGaussianKernels

它适用于Size(3, 3). 我哪里错了?谢谢你。

4

2 回答 2

0

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,但这是非常基本的功能,它最近几乎没有更改。

您还可以尝试同时提供sigma1and sigma2(并使用双精度值来避免隐式类型转换):

double sigmaX = 1.;
double sigmaY = 1.;
cv::GaussianBlur(input, smooth, cv::Size(0, 0), sigmaX, sigmaY);
于 2019-11-25T10:09:12.340 回答
0

您不能将内核大小设为零。您可以将 sigma 值设为零。这就是断言失败的原因。

同样重要的是要注意内核的尺寸应该严格地是奇数。

于 2019-11-25T06:48:42.900 回答