ошибка на размытии по Гауссу методом свертки в openCV2.3 - PullRequest
0 голосов
/ 29 сентября 2011

Я пишу, используя 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 () ... Кто-нибудь может мне помочь?ОГРОМНОЕ СПАСИБО!

1 Ответ

1 голос
/ 30 сентября 2011

Я предполагаю, что ваша 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)
...