0

我在 c++ 和 opencv 中有一个非常基本的问题。我想将双边滤镜应用到我的图像中,但出现此错误,表明我没有分配内存!

“0x7620c41f 处未处理的异常”

现在这是我的问题:即使我没有定义任何指针,我也应该分配内存吗?

for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 ){
    bilateralFilter ( result, dst, i, i*2, i/2 );
}

这是 result 和 dst 的类型,它们都被定义为 Mat ...

cv::Mat result = Mat(height, width, CV_32FC1, distances);
cv::Mat dst = Mat(height,width, CV_32FC1, distances);

当我调试它时,我将红点放在 for line 中,当我进入下一行时,我得到了错误:(

对不起,我的问题是基本的,提前感谢。

4

1 回答 1

1

对不起,您没有cv::bilateralFilter()正确调用该函数。

根据可用的文档,原型是:

void cv::bilateralFilter(InputArray src, OutputArray dst, int d, 
                         double sigmaColor, double sigmaSpace)

附加条件src是 8 位、1 或 3 通道图像,并且dst具有与 相同的类型和大小src

在您提供的代码中,有几个问题:

  • src(你的变量result)似乎没有用任何图像数据初始化(但也许这是一个问题工件)
  • 您的src矩阵是 32 位 1 通道图像,而不是 8 位 1 通道图像。您需要事先将矩阵转换为正确的数据类型,例如result.convertTo(src, CV_8U, aProperScalingFactor);. 需要缩放因子以确保您有 [0,255] 范围内的 8 位数据;
  • 正如@berak 在评论中指出的那样,您以某种方式试图定义两个共享相同基础数据存储的矩阵。不过,该功能的行为cv::bilateralFilter()并未提及就地处理能力。
于 2013-10-25T08:37:06.507 回答