【发布时间】:2012-11-26 11:18:35
【问题描述】:
我正在尝试使用 C++ 接口使用 FFTW 3.3 和 OpenCV 2.1 编写 FFT/IFFT 函数。我看过很多使用旧 OpenCV 格式的示例,我进行了直接转换,但有些东西不起作用。
我的函数的目标是返回一个具有 FFT 实部和虚部的 Mat 对象,就像 dft 默认 OpenCV 函数一样。这是函数的代码。程序在将 im_data 复制到 data_in 的行中因内存问题而阻塞。
有人知道我做错了什么吗?谢谢
Mat fft_sr(Mat& I)
{
double *im_data;
double *realP_data;
double *imP_data;
fftw_complex *data_in;
fftw_complex *fft;
fftw_plan plan_f;
int width = I.cols;
int height = I.rows;
int step = I.step;
int i, j, k;
Mat realP=Mat::zeros(height,width,CV_64F); // Real Part FFT
Mat imP=Mat::zeros(height,width,CV_64F); // Imaginary Part FFT
im_data = ( double* ) I.data;
realP_data = ( double* ) realP.data;
imP_data = ( double* ) imP.data;
data_in = ( fftw_complex* )fftw_malloc( sizeof( fftw_complex ) * width * height );
fft = ( fftw_complex* )fftw_malloc( sizeof( fftw_complex ) * width * height );
// Problem Here
for( i = 0, k = 0 ; i < height ; i++ ) {
for( j = 0 ; j < width ; j++ ) {
data_in[k][0] = ( double )im_data[i * step + j];
data_in[k][1] = ( double )0.0;
k++;
}
}
plan_f = fftw_plan_dft_2d( height, width, data_in, fft, FFTW_FORWARD, FFTW_ESTIMATE );
fftw_execute( plan_f );
// Copy real and imaginary data
for( i = 0, k = 0 ; i < height ; i++ ) {
for( j = 0 ; j < width ; j++ ) {
realP_data[i * step + j] = ( double )fft[k][0];
imP_data[i * step + j] = ( double )fft[k][1];
k++;
}
}
Mat fft_I(I.size(),CV_64FC2);
Mat fftplanes[] = {Mat_<double>(realP), Mat_<double>(imP)};
merge(fftplanes, 2, fft_I);
fftw_destroy_plan(plan_f);
fftw_free(data_in);
fftw_free(fft);
return fft_I;
}
【问题讨论】:
-
step设置为什么? “这里的问题”到底是什么意思?当您将行std:cout << i << "/" << j << std::endl;添加到产生问题的嵌套循环结构的内部循环主体时会发生什么? -
步长固定为 4096(8 字节(CV_64F,64 位浮点数)* 512(行大小)),它们是 512x512 图像。添加这一行,它会在 i=64,j=506 处引发“访问冲突读取位置 0x04331000”