正如opencv docs所指出的,
高斯核大小。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)。我哪里错了?谢谢。
发布于 2019-11-25 06:48:42
您不能使内核大小为零。您可以将西格玛值设为零。这就是为什么断言失败的原因。
同样重要的是要注意,核的维数应该严格地是奇数。
发布于 2019-11-25 10:09:12
您可以用您的内核调用cv::GaussianBlur(...),在本例中,内核大小在两个维度中都必须是奇数:kernel.width % 2 == 1 && kernel.height % 2 == 1。
或者,您可以不设置内核大小,并提供正西格玛值(必须设置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和sigma2 (并使用双值来避免隐式类型转换):
double sigmaX = 1.;
double sigmaY = 1.;
cv::GaussianBlur(input, smooth, cv::Size(0, 0), sigmaX, sigmaY);https://stackoverflow.com/questions/49773387
复制相似问题