OpenCV C++ 使用高斯核函数计算晕影效果

Posted

技术标签:

【中文标题】OpenCV C++ 使用高斯核函数计算晕影效果【英文标题】:OpenCV C++ to calculate vignette effect using gaussian kernel function 【发布时间】:2016-01-15 21:01:30 【问题描述】:

我尝试将 this reply 从 python 转换为 C++,但我被困在第一次调用乘法... small 是我的输入 Mat,有 2 个暗淡和大约 600x400 列/行。

Mat a = getGaussianKernel(small.cols, .3);
Mat b = getGaussianKernel(small.rows, .3);
Mat ta;
transpose(a, ta);
Mat c = *new Mat(ta.rows, ta.cols, ta.type());
cv::multiply(ta, b, c);
Mat d;
cv::max(c, d);
d = c / d;
Mat e;
multiply(small, d, e);

错误信息如下:

该操作既不是'array op array'(其中数组具有相同的大小和相同的通道数),也不是'array op scalar',也不是函数arithm_op中的'scalar op array'

我对 numpy 或 matplotlib 都不熟悉,但我对 C++ 的限制需要冗长的解释......

【问题讨论】:

哪一行给你错误?我假设这是第一次打电话给cv::multiply? 没错。我在我的问题中澄清了。 【参考方案1】:

如果您阅读documentation 中的cv::multiply,您会看到它期望前两个输入具有相同的大小和类型。这是因为它试图进行逐元素乘法

您的高斯内核a 被定义为 600 x 1(getGaussianKernel 建议第一个输入为 奇数),因此转置 (ta) 将是 1 x 600.

第二个输入,b 被定义为 400 x 1(同样,应该是一个奇数大小)。

显然这两个不是相同的尺寸尺寸/尺寸。

您只需要使用* 运算符,而不是使用cv::multiply,这是您可能想要的matrix product。

Mat C = b * ta

这应该产生一个 400 x 600 的矩阵。

另外,我切换了bta 的顺序,这样矩阵维数就可以进行乘法运算了。

注意您的代码还有其他一些问题。您正在使用cv::max() 将空矩阵与c 进行比较。你应该使用cv::minMaxLoc

最后一行的乘法看起来应该没问题,因为您想逐个像素或逐个元素地将高斯图像的组合直接应用于输入图像。

【讨论】:

这给了我 libc++abi.dylib:以 cv::Exception 类型的未捕获异常终止:/Users/alexandershishkov/dev/opencv2.4.9/opencv/modules/core/src/matmul。 cpp:718: 错误: (-215) a_size.width == len in function gemm 一定要检查我上次的编辑,我切换了bta的顺序 最后一条评论似乎成功了。谢谢大佬。 minLaxLoc 应该是 minMaxLoc,不是吗? docs.opencv.org/2.4/modules/core/doc/… 也刚刚更正了最后一行,因为您应该在那里使用元素乘法。

以上是关于OpenCV C++ 使用高斯核函数计算晕影效果的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习-均值滤波高斯滤波中值滤波双边滤波

支持向量机高斯核调参小结

Python深度学习:计算机视觉处理库OpenCVNumpy编辑图片高斯模糊处理(读书笔记)

高斯核函数

OpenCV(二)掩码操作与平滑(均值,高斯模糊)

Unity高斯模糊Shader