【问题标题】:error on Gaussian blur with convolution method in openCV2.3openCV2.3中卷积方法的高斯模糊错误
【发布时间】:2011-09-30 14:19:22
【问题描述】:

我编写了使用 openCV api 创建一个高斯内核,然后将其传递给 Conv2ByDFT 函数进行卷积。但是程序崩溃了,我不知道为什么。这是代码。

void Conv2ByFFT(const Mat& f,const Mat& g,Mat& result)
{
result.create(abs(f.rows-g.rows+1),abs(f.cols-g.cols+1),f.type());

Size dftSize;
dftSize.width = getOptimalDFTSize(f.cols + g.cols - 1);
dftSize.height = getOptimalDFTSize(f.rows + g.cols -1);

Mat tmpF(dftSize,f.type(),Scalar::all(0));
Mat tmpG(dftSize,g.type(),Scalar::all(0));

dft(tmpF,tmpF,0,f.rows);
dft(tmpG,tmpG,0,g.rows);

mulSpectrums(tmpF,tmpG,tmpF,0);

dft(tmpF,tmpF,DFT_INVERSE+DFT_SCALE,result.rows);

tmpF(Rect(0,0,result.cols,result.rows)).copyTo(result);
}

这是 main() 中调用上述函数的一些代码

Mat gaussianFilter = getGaussianKernel(7,2.0,CV_64F); // create Gaussian kernel
Conv2ByFFT(src,gaussianFilter,result); // do the convolution

我不知道是 getGaussianKernel() 函数有问题还是我的 Conv2ByFFT() 函数有问题...谁能帮帮我?非常感谢!

【问题讨论】:

  • 错误是什么?它在哪一行崩溃?
  • 对不起,我没有说清楚:P。错误如下:“OPENCV ERROR: Assertion failed (type == CV_32FC1 || type == CV_32FC2 || type == CV_64FC1 || type == CV_64FC2) in unknown function,file..\..\..\ moduels\core\src\dxt.cpp,line 1483 "并且程序在 "dft(tmpF,tmpF,0,f.rows)" 行崩溃

标签: image-processing opencv gaussian


【解决方案1】:

我的猜测是您的 src 矩阵不是 CV_32F 或 CV_64F(32 或 64 位浮点)格式。如果是图片,可能需要转换一下。

来自 OpenCV 文档的提醒:

矩阵元素的类型以CV_(S|U|F)C形式指定,例如:CV_8UC1表示8位无符号单通道矩阵,CV_32SC2表示32位有符号矩阵 有两个频道。

这是来自源代码的完整定义列表:

#define     CV_16S   3
#define     CV_16SC(n)   CV_MAKETYPE(CV_16S,(n))
#define     CV_16SC1   CV_MAKETYPE(CV_16S,1)
#define     CV_16SC2   CV_MAKETYPE(CV_16S,2)
#define     CV_16SC3   CV_MAKETYPE(CV_16S,3)
#define     CV_16SC4   CV_MAKETYPE(CV_16S,4)
#define     CV_16U   2
#define     CV_16UC(n)   CV_MAKETYPE(CV_16U,(n))
#define     CV_16UC1   CV_MAKETYPE(CV_16U,1)
#define     CV_16UC2   CV_MAKETYPE(CV_16U,2)
#define     CV_16UC3   CV_MAKETYPE(CV_16U,3)
#define     CV_16UC4   CV_MAKETYPE(CV_16U,4)
#define     CV_32F   5
#define     CV_32FC(n)   CV_MAKETYPE(CV_32F,(n))
#define     CV_32FC1   CV_MAKETYPE(CV_32F,1)
#define     CV_32FC2   CV_MAKETYPE(CV_32F,2)
#define     CV_32FC3   CV_MAKETYPE(CV_32F,3)
#define     CV_32FC4   CV_MAKETYPE(CV_32F,4)
#define     CV_32S   4
#define     CV_32SC(n)   CV_MAKETYPE(CV_32S,(n))
#define     CV_32SC1   CV_MAKETYPE(CV_32S,1)
#define     CV_32SC2   CV_MAKETYPE(CV_32S,2)
#define     CV_32SC3   CV_MAKETYPE(CV_32S,3)
#define     CV_32SC4   CV_MAKETYPE(CV_32S,4)
#define     CV_64F   6
#define     CV_64FC(n)   CV_MAKETYPE(CV_64F,(n))
#define     CV_64FC1   CV_MAKETYPE(CV_64F,1)
#define     CV_64FC2   CV_MAKETYPE(CV_64F,2)
#define     CV_64FC3   CV_MAKETYPE(CV_64F,3)
#define     CV_64FC4   CV_MAKETYPE(CV_64F,4)
#define     CV_8S   1
#define     CV_8SC(n)   CV_MAKETYPE(CV_8S,(n))
#define     CV_8SC1   CV_MAKETYPE(CV_8S,1)
#define     CV_8SC2   CV_MAKETYPE(CV_8S,2)
#define     CV_8SC3   CV_MAKETYPE(CV_8S,3)
#define     CV_8SC4   CV_MAKETYPE(CV_8S,4)
#define     CV_8U   0
#define     CV_8UC(n)   CV_MAKETYPE(CV_8U,(n))
#define     CV_8UC1   CV_MAKETYPE(CV_8U,1)
#define     CV_8UC2   CV_MAKETYPE(CV_8U,2)
#define     CV_8UC3   CV_MAKETYPE(CV_8U,3)
#define     CV_8UC4   CV_MAKETYPE(CV_8U,4)

【讨论】:

  • 是的,你是对的! Mat src = imread("lena.bmp") 所以 src 的类型,我检查的是 16。所以我使用 'convertTo' 函数将其转换为 CV_64F 进行卷积。但在那之后我需要将结果转换回原始类型(这里是 16),或者输出图像看起来完全是黑色的。我检查了 CV_BGRA2BGR565 类型是否为 16,所以我调用了“result.convertTo(newresult,CV_BGRA2BGR565)”。但是当我调试程序时,我发现 newresult.type() 总是 0,而不是 16。为什么会发生:'(
  • 我不确定您是否需要使用 convertTo,因为那是为了转换色彩空间。你需要转换位深度,所以试试 cvConvertScale。
  • 对不起,cvConvertScale 的第一个和第二个参数是 IplImage* 类型,所以我称之为“cvConvertScale(&result,&tmp,1/255)”。它再次崩溃,错误说“错误的论点”。我想知道是否有 MAT 类型可以作为这个函数的参数还是我必须使用 IplImage 类型? (因为我用的是openCV2.3)
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多