当Mat的类型为CV_32S时,OpenCV MedianBlur函数崩溃

时间:2013-06-20 14:51:21

标签: opencv image-processing computer-vision filtering

我正在努力将Bayer模式去马赛克到RGB图像,而不使用OpenCV的直接转换功能。我使用了Bilinear插值并使其工作,但我想通过使用Freeman方法来提高质量。此方法需要中值过滤器。 OpenCV具有medianBlur功能,可以做到这一点。但是我在使用这个功能时遇到了麻烦。当我应用medianBlur的cv :: Mat是CV_8UC1类型然后它工作,但如果它是CV_32S类型,那么它不起作用。 这样做 NOT 工作:

    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,那么它可以正常工作。在调试时,我发现它在第二次迭代中崩溃,而不是在第一次迭代中崩溃。但是,我需要它来运行两次迭代。如果单独编写, NOT 也可以工作:

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

顺便说一下,我不必使用CV_32S,但我需要能够在矩阵中存储负数。
注意:我已尝试将矩阵中的所有数字设为正数,然后使用medianBlur,但它仍无法正常工作。
所有帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:5)

OpenCV documentation似乎很清楚:

  

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

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

此外,文档说

  

ksize - 光圈线性尺寸;它必须是奇数且大于1,例如:3,5,7

你的循环应用1和3的大小(如果我正确读取你的代码),第一个是无效的,这可能解释了你的第一次迭代没有崩溃的原因(因为它先前失败了)。