使用 cv::Mat 与多维 FFTW3

Using cv::Mat with multi-dimensional FFTW3

无论如何,如何使用 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*inputcv::Mat。我想摆脱将数据复制到 data_in 的循环,只使用来自 input 的已分配数据。

如果我对您的代码段的理解正确,您想要将数据从 cv::Mat 复制到浮点数组。假设您的 cv::MatCV_32F (浮点数)类型,而不是单独复制每个元素,您可以使用 memcpy:

复制整个块
std::memcpy(data_in, input.data, input.total() * sizeof(float));

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