【问题标题】:OpenCV MedianBlur function crashing when Mat is of type CV_32S当 Mat 为 CV_32S 类型时,OpenCV MedianBlur 函数崩溃
【发布时间】:2013-06-20 23:20:10
【问题描述】:

我正在不使用 OpenCV 的直接转换功能将拜耳模式去马赛克到 RGB 图像。我使用了双线性插值并让它工作,但我想通过使用弗里曼方法来提高质量。此方法需要中值滤波器。 OpenCV 具有可以做到这一点的 medianBlur 函数。但是我在使用这个功能时遇到了麻烦。当我应用 medianBlur 的 cv::Mat 是 CV_8UC1 类型时,它可以工作,但如果它是 CV_32S 类型,那么它就不起作用。 这工作:

    redGreenMedian.create(input.size(), CV_32S);
    blueGreenMedian.create(input.size(), CV_32S);
    blueMinusGreen.create(input.size(), CV_32S);
    redMinusGreen.create(input.size(), CV_32S);
    for(int i = 1; i <= 3; i += 2)
    {
            cv::medianBlur(redMinusGreen, redGreenMedian, i);
            cv::medianBlur(blueMinusGreen, blueGreenMedian, i);
    }

如果我将所有 CV_32S 更改为 CV_8UC1,那么它可以工作。在调试时,我发现它在第二次迭代中崩溃,而不是在第一次迭代中。但是,我需要它在两次迭代中都运行。这在单独编写时也起作用:

    cv::medianBlur(redMinusGreen, redGreenMedian, 3);

顺便说一句,我不必使用 CV_32S,但我需要能够在矩阵中存储负数。
注意:我已尝试将矩阵中的所有数字设为正数然后使用medianBlur,但还是不行。
感谢所有帮助。提前致谢。

【问题讨论】:

  • 是的,不处理输入的段错误是不常见的!由于medianBlur 函数,我只看到过崩溃。

标签: opencv image-processing computer-vision filtering


【解决方案1】:

OpenCV documentation 好像很清楚:

src – 输入 1、3 或 4 通道图像;当ksize为3或5时,图像深度应为CV_8UCV_16UCV_32F,对于更大的光圈尺寸,只能为CV_8U

由于您需要满足签名值,我认为您最好的选择是使用CV_32F

另外,文档说

ksize——光圈线性大小;它必须是奇数且大于 1,例如:3、5、7

您的循环应用大小为 1 和 3(如果我正确阅读了您的代码),其中第一个是无效的,这可能解释了为什么您的第一次迭代没有崩溃(因为它更早失败了)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多