Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing openCV2.3中卷积法高斯模糊的误差_Image Processing_Opencv_Gaussian - Fatal编程技术网

Image processing openCV2.3中卷积法高斯模糊的误差

Image processing openCV2.3中卷积法高斯模糊的误差,image-processing,opencv,gaussian,Image Processing,Opencv,Gaussian,我使用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

我使用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()函数是否有问题……有人能帮我吗?非常感谢

我猜您的
src
矩阵不是CV_32F或CV_64F(32或64位浮点)格式。如果是图像,则可能需要对其进行转换

OpenCV文档中的提醒:

矩阵元素的类型以CV|U | F)C的形式指定,例如:CV|U 8UC1表示8位无符号单通道矩阵,CV|U 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)

错误是什么?它崩溃在哪一行上?抱歉,我没有说清楚:P。错误如下:“OPENCV错误:断言失败(type==CV_32FC1 | | type==CV_32FC2 | type==CV_64FC1 | type==CV_64FC2)在未知函数、文件中…\\\\\ moduels\core\src\dxt.cpp,第1483行”和程序崩溃在“dft(tmpF,tmpF,0,f.rows)”行”是的!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)