使用cv :: Mat与多维FFTW3

时间:2018-02-21 14:17:06

标签: c++ opencv fftw

无论如何使用来自FFTW3的fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1,double *in, fftw_complex *out, unsigned flags)函数和输入作为来自cv :: Mat对象的数据?我目前正在使用的代码如下所示:

data_in =  fftwf_alloc_real(width * height);
fft = fftwf_alloc_complex((width/2+1) * height);

plan_f=fftwf_plan_dft_r2c_2d( height , width , data_in, fft ,  FFTW_MEASURE );
// Prepare input data
for(int i = 0,k=0; i < height; ++i) {
    const float* row = input.ptr<float>(i);
    for(int j = 0; j < width; j++) {
        data_in[k]=(float)row[j];
        k++;
    }
}

// Exectue fft
fftwf_execute( plan_f );

其中 data_in 是数组类型float*输入cv::Mat。我想摆脱将数据复制到 data_in 的for循环,并使用输入中已经分配的数据。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的代码段,您希望将数据从cv::Mat复制到浮点数组。假设您的cv::Mat类型为CV_32F(浮点数),而不是单独复制每个元素,您只需使用memcpy复制整个块:

std::memcpy(data_in, input.data, input.total() * sizeof(float));

或者您可以完全跳过复制,只需使用(float*)input.data